• 1005. K 次取反后最大化的数组和


    1005. 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 解法1:96 ms    8.6 MB
     2 class Solution {
     3 public:
     4     int largestSumAfterKNegations(vector<int>& A, int K) {
     5         /*思路:
     6             数组 里面的数值可能有正 ,负 ,k次取反,
     7             先对数组从小大排序,负数在前,正数在后,
     8             1:如果数组里面的负数,
     9             1.1负数的个数>=K ,那么可以负数取反k次,最后求和
    10             1.2如果负数的个数<k,那么将负数的个数m 全部取反后,剩余k-m次,
    11         1.3重新,排序,因为原先的负数 变成正的了,可能更小 如 -10,-1,4,5,
    12                 -1 变成1,那么,最小,所以重新排序
    13                然后对第一个非负数进行操作,因为可以多次选择同一个索引 i。
    14             1.4也可以不排序,定义一个变量 代表当前最小值
    15             若(k-m)%2==0; 那么,第一个非负数为正,然后求和
    16             若(k-m)%2==1 那么,第一个非负数为负,然后求和
    17             2:若全为正数,排序,只对第一个 非负数进行操作k次 ,然后求和
    18         */  
    19         sort(A.begin(),A.end());
    20         int cnt=0;
    21         
    22         for(int i=0;i<A.size();i++){
    23             if(cnt==K) break;
    24             if(A[i]<0&&cnt<K){
    25                 A[i]=-A[i];
    26                 cnt++;
    27             }else{
    28                 sort(A.begin(),A.end());
    29                 if((K-cnt)%2!=0){//A[0]最小
    30                     A[0]=-A[0];
    31                    
    32                 }
    33          break;
    34             }
    35         }
    36         int sum=0;
    37         for(int i=0;i<A.size();i++){
    38             sum+=A[i];
    39         }
    40         return sum;
    41     }
    42 };
     1 解法2:    4 ms    8.7 MB
     2 class Solution {
     3 public:
     4     int largestSumAfterKNegations(vector<int>& A, int K) {
     5         /*思路:
     6             数组 里面的数值可能有正 ,负 ,k次取反,
     7             先对数组从小大排序,负数在前,正数在后,
     8             1:如果数组里面的负数,
     9             1.1负数的个数>=K ,那么可以负数取反k次,最后求和
    10             1.2如果负数的个数<k,那么将负数的个数m 全部取反后,剩余k-m次,
    11         1.3重新,排序,因为原先的负数 变成正的了,可能更小 如 -10,-1,4,5,
    12                 -1 变成1,那么,最小,所以重新排序
    13                然后对第一个非负数进行操作,因为可以多次选择同一个索引 i。
    14             1.4也可以不排序,定义一个变量 代表当前最小值
    15             若(k-m)%2==0; 那么,第一个非负数为正,然后求和
    16             若(k-m)%2==1 那么,第一个非负数为负,然后求和
    17             2:若全为正数,排序,只对第一个 非负数进行操作k次 ,然后求和
    18         */  
    19         sort(A.begin(),A.end());
    20         int cnt=0;
    21         int Min=INT_MAX,id=0;//记录一个最小值,和要进行修改的下标
    22         for(int i=0;i<A.size();i++){
    23             if(cnt==K) break;
    24             if(A[i]<0&&cnt<K){
    25                 A[i]=-A[i];
    26                 cnt++;
    27                 if(Min>A[i]){//更新最小值和下标
    28                     Min=A[i];
    29                     id=i;
    30                 }
    31             }else{   //sort(A.begin(),A.end());
    32                 if((K-cnt)%2!=0){//负数变成正数的最小值和 原来就非负 的第一个最小值进行比较
    33                     if(Min<A[i])   A[id]=-A[id];//看谁最小
    34                     else A[i]=-A[i];
    35                 }
    36                 break;
    37             }
    38         }
    39         int sum=0;
    40         for(int i=0;i<A.size();i++){
    41             sum+=A[i];
    42         }
    43         return sum;
    44     }
    45 };
  • 相关阅读:
    图像旋转中原图16×16分块测试1
    散射对成像的影响、图像退化
    图像分块后相邻像素点旋转过程中对块内信息的利用率估算
    图像分块测试记录(还不对)
    【戏言、昔言、惜言】谭惜言写了一辈子的戏,真情假意,全在戏言里。
    照花台、无锡景、探清水河调
    Python3.x:chrome运行webdriver脚本提示--ignore-certificate-errors
    Python3.x:pip命令安装第三方库,超时处理方案
    Python3.x:抢票
    Python3.x:定时任务实现方式
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11992640.html
Copyright © 2020-2023  润新知