1005. K 次取反后最大化的数组和 VS 1002.查找常用字符

给定一个整数数组 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
/**
 * @param {number[]} A
 * @param {number} K
 * @return {number}
 */
var largestSumAfterKNegations = function(A, K) {
    A.sort((a, b)=> a-b);
    let a=0;
    A.forEach(item=>{
       if(item<=0) a++; 
    })
    if(a<=K){
        A = A.map(a=>Math.abs(a));
        if((K-a)%2){
            A.sort((a, b)=> a-b);
            A[0] = -A[0];
        }
        return A.reduce((init, val)=>init+val)
    } else {
        for(let i=0; i<K; i++){
            A[i] = -A[i]
        }
        return A.reduce((init, val)=>init+val, 0);
    }
    
};
扫描二维码关注公众号,回复: 5486748 查看本文章

想法:

开始想的是要在[0, A.length-1]里面取K次,把所有的可能遍历一遍,然后Math.max();其实也想到排一下序也可以ok(也许排下序列,真的会有新的想法)。还想了,要不也拼一下字符串然后eval。

猜你喜欢

转载自www.cnblogs.com/zhangzs000/p/10508403.html