文章目录
- [一. 力扣 [1005. K 次取反后最大化的数组和](https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/)](#一. 力扣 1005. K 次取反后最大化的数组和)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [二. 力扣 [2418. 按身高排序](https://leetcode.cn/problems/sort-the-people/description/)](#二. 力扣 2418. 按身高排序)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
-
- [(1) 解法一](#(1) 解法一)
- [(2) 解法二](#(2) 解法二)
- [三. 力扣 [870. 优势洗牌](https://leetcode.cn/problems/advantage-shuffle/description/)(田忌赛马)](#三. 力扣 870. 优势洗牌(田忌赛马))
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
一. 力扣 1005. K 次取反后最大化的数组和
1. 题目解析
2. 算法原理
3. 代码
java
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
int m = 0, ret = 0, n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i] < 0) {
m++;
}
}
if (m == k) {
for (int num : nums) {
if (num < 0) {
ret += -num;
}else {
ret += num;
}
}
}else if (m > k) {
PriorityQueue<Integer> q = new PriorityQueue<>();
for (int num : nums) {
q.add(num);
}
for (int i = 0; i < k; i++) {
q.add(-q.poll());
}
while(!q.isEmpty()) {
ret += q.poll();
}
}else {
PriorityQueue<Integer> q = new PriorityQueue<>();
for (int num : nums) {
ret += Math.abs(num);
q.add(Math.abs(num));
}
if ((k - m) % 2 != 0) {
ret -= 2 * q.poll();
}
}
return ret;
}
}
二. 力扣 2418. 按身高排序
1. 题目解析
对应的人名有对应的身高, 要求是身高排好序后, 其名字也得对应上
2. 算法原理
这里提供两种解法, 第一种解法较为简单, 但是使用的场景有限, 在身高相同名字不同的场景不适用, 而第二种解法是万金油
3. 代码
(1) 解法一
java
class Solution {
public String[] sortPeople(String[] names, int[] heights) {
int n = names.length;
HashMap<Integer, String> hash = new HashMap<>();
String[] ret = new String[n];
for (int i = 0; i < n; i++) {
hash.put(heights[i], names[i]);
}
Arrays.sort(heights);
for (int i = 0, j = n - 1; i < j; i++, j--) {
int temp = heights[i];
heights[i] = heights[j];
heights[j] = temp;
}
for(int i = 0; i < n; i++) {
ret[i] = hash.get(heights[i]);
}
return ret;
}
}
(2) 解法二
java
class Solution {
public String[] sortPeople(String[] names, int[] heights) {
int n = names.length;
String[] ret = new String[n];
Integer[] index = new Integer[n];
for (int i = 0; i < n; i++) {
index[i] = i;
}
Arrays.sort(index, (a, b) -> heights[b] - heights[a]);
for(int i = 0; i < n; i++) {
ret[i] = names[index[i]];
}
return ret;
}
}
三. 力扣 870. 优势洗牌(田忌赛马)
1. 题目解析
该题意可以说和田忌赛马一个意思, 大于就得一分, 求最佳出场顺序
2. 算法原理
3. 代码
java
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
int n = nums1.length;
int[] ret = new int[n];
int left = 0, right = n - 1;
Integer[] index = new Integer[n];
for (int i = 0; i < n; i++) index[i] = i;
Arrays.sort(index, (a, b) -> nums2[a] - nums2[b]);
Arrays.sort(nums1);
for (int i = 0; i < n; i++) {
if (nums1[i] > nums2[index[left]]) {
ret[index[left++]] = nums1[i];
}else {
ret[index[right--]] = nums1[i];
}
}
return ret;
}
}





