力扣1005题(K次取反后最大化的数组和)
1005.K次取反后最大化的数组和
基本思想:
贪心算法
具体实现:
局部最优:让绝对值大的负数变为正数
整体最优:整个数组和达到最大
局部最优:让绝对值小的正数变为负数
整体最优:整个数组和达到最大
1.将数组按照绝对值大小从大到小排序
2.遍历数组,遇到负数将其变为正数,同时k--
3.k还大于0的话,让反复转变数值小的元素,将k用完
4.求和
代码:
class Solution { public int largestSumAfterKNegations(int[] nums, int K) { int sum = 0; int n = nums.length; Integer[] sortNums = new Integer[n]; for(int i = 0; i < n; i++) sortNums[i] = nums[i];//new Integer(nums[i]);自动装箱 Arrays.sort(sortNums, (a,b)->{//逆序排序 return Math.abs(b) - Math.abs(a); }); for (int i = 0; i < n; i++) { if (sortNums[i] < 0 && K > 0) { sortNums[i] *= -1; K--; } } if (K != 0) {//这时sortNums数组中都是正数,如果剩下的k是奇数,让最后一个数变负数 sortNums[n - 1] = (K % 2 == 1) ? (-sortNums[n - 1]) : sortNums[n - 1]; } for (int i = 0; i < n; i++) { sum += sortNums[i]; } return sum; }