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. 1 <= A.length <= 10000
  2. 1 <= K <= 10000
  3. -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 }

 

posted @ 2019-03-11 16:05  natural_law_hwh  阅读(321)  评论(0编辑  收藏  举报