leetcode K 次取反后最大化的数组和
K 次取反后最大化的数组和
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i
并将 A[i]
替换为 -A[i]
,然后总共重复这个过程 K
次。(我们可以多次选择同一个索引 i
。)
以这种方式修改数组后,返回数组可能的最大和。
示例 1:
输入:A = [4,2,3], K = 1 输出:5 解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。
示例 2:
输入:A = [3,-1,0,2], K = 3 输出:6 解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。
示例 3:
输入:A = [2,-3,-1,5,-4], K = 2 输出:13 解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。
提示:
1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A[i] <= 100
解题思路 这道题使用的是贪心算法,根据题意我们可以知道要求该数组最大的和,每次翻转都要翻使和最大,首先我们先通过排序来把让其从小到大排列,最小的是负数情况下吧负数最小的翻转可以获得最大和,当负数没有了时在排一遍,把最小的进行翻转即可。还要注意翻转次数,偶数次可以翻转同一个数。
1 class Solution { 2 public int largestSumAfterKNegations(int[] A, int K) { 3 int sz[]=new int[A.length]; 4 int fs=0; 5 for (int i = 0; i < A.length; i++) { 6 sz[i]=A[i]; 7 if(A[i]<0){ 8 fs++; 9 } 10 } 11 Arrays.sort(sz); 12 int ks=K; 13 int sum=0; 14 if(fs>ks) { 15 for (int i = 0; i < sz.length; i++) { 16 if (ks != 0) { 17 sz[i] = -sz[i]; 18 ks--; 19 } 20 sum =sum+sz[i]; 21 } 22 return sum; 23 } 24 else{ 25 for (int i = 0; i < sz.length; i++) { 26 if(fs!=0){ 27 sz[i]=-sz[i]; 28 fs--; 29 ks--; 30 } 31 sum=sum+sz[i]; 32 } 33 if(ks!=0){ 34 if(ks%2==0){ 35 return sum; 36 } 37 else{ 38 Arrays.sort(sz); 39 return sum-sz[0]*2; 40 } 41 } 42 else{ 43 return sum; 44 } 45 } 46 47 48 } 49 }