zoukankan      html  css  js  c++  java
  • 1005. Maximize Sum Of Array After K Negations

    题目

    Given an array A of integers, we must modify the array in the following way: we choose an i and replace A[i] with -A[i], and we repeat this process K times in total. (We may choose the same index i multiple times.)

    Return the largest possible sum of the array after modifying it in this way.

    Example 1:

    Input: A = [4,2,3], K = 1  
    Output: 5  
    Explanation: Choose indices (1,) and A becomes [4,-2,3].
    

    Example 2:

    Input: A = [3,-1,0,2], K = 3  
    Output: 6
    Explanation: Choose indices (1, 2, 2) and A becomes [3,1,0,2].
    

    Example 3:

    Input: A = [2,-3,-1,5,-4], K = 2
    Output: 13
    Explanation: Choose indices (1, 4) and A becomes [2,3,-1,5,4].
    

    Note:

    1. 1 <= A.length <= 10000
    2. 1 <= K <= 10000
    3. -100 <= A[i] <= 100

    原题链接

    解法一

    class Solution {
        public int largestSumAfterKNegations(int[] A, int K) {
           java.util.Arrays.sort(A);
            int lenA = A.length;
            int lenB=0,lenC=0;
            int result;
            if(A[0]>=0){
                result = arraySum(A,1,lenA-1);
                if(K%2==0)
                   result+=A[0];
                else
                   result-=A[0];
            }else if(A[lenA-1]<=0){
                result = arraySum(A,K,lenA-1)-arraySum(A,0,1);
            }else{
                result=largestSumInBothPlusMinus(A,K);
            }
           
            return result;
        }
        public int largestSumInBothPlusMinus(int[] A, int K) {
            int result=0;
            int lenA = A.length; 
            int start = 0;
            int end = A.length-1;
            int mid=(start+end)/2;
            int maxLessIndex=-1;
            while(mid>0&&mid+1<lenA){
                if(A[mid]<0){
                    if(A[mid+1]<0){
                        start=mid+1;
                        mid=(mid+1+end)/2;
                        if(mid==lenA-2){
                            maxLessIndex=mid;
                            break;
                        }
    
                    }else{
                        maxLessIndex=mid;
                        break;
                    }
                }
                else{
                   if(A[mid-1]>=0){
                        end=mid-1;
                        mid=(start+mid-1)/2;
                        if(mid==0){
                            maxLessIndex=mid;
                            break;
                        } 
                    }else{
                        maxLessIndex=mid-1;
                        break;
                    }
                }
            }
            if(K<maxLessIndex+1){
                result=-arraySum(A,0,K-1)+arraySum(A,K,maxLessIndex)+arraySum(A,maxLessIndex+1,lenA-1);
            }else if(K==maxLessIndex+1){
                result=-arraySum(A,0,maxLessIndex)+arraySum(A,maxLessIndex+1,lenA-1);
            }else{
                result=-arraySum(A,0,maxLessIndex)+arraySum(A,maxLessIndex+2,lenA-1);
                int remainK =  K-maxLessIndex-1;
                if(remainK%2==0){
                    result+=A[maxLessIndex+1];
                }
                else{
                    if(-A[maxLessIndex]<A[maxLessIndex+1]){
                        result=result+A[maxLessIndex+1]+2*A[maxLessIndex];
                    }else{
                        result-=A[maxLessIndex+1];
                    }
                }
            }
            return result;
            
        }
        public int arraySum(int [] A, int start, int end){
            int sum = 0;
            for(int i=start;i<=end;i++){
                sum+=A[i];
            }
            return sum;
        }
    }
    

    解法二:简化求最大的小于0的值得坐标

    class Solution {
        public int largestSumAfterKNegations(int[] A, int K) {
           java.util.Arrays.sort(A);
            int lenA = A.length;
            int lenB=0,lenC=0;
            int result;
            if(A[0]>=0){
                result = arraySum(A,1,lenA-1);
                if(K%2==0)
                   result+=A[0];
                else
                   result-=A[0];
            }else if(A[lenA-1]<=0){
                result = arraySum(A,K,lenA-1)-arraySum(A,0,1);
            }else{
                result=largestSumInBothPlusMinus(A,K);
            }
           
            return result;
        }
        public int largestSumInBothPlusMinus(int[] A, int K) {
            int maxLessIndex=-1;
            int result=0;
            int lenA=A.length;
            int i;
            for(i=0;i<lenA;i++){
                if(A[i]<0)
                    continue;
                else
                    break;
            }
            maxLessIndex=i-1;
            if(K<maxLessIndex+1){
                result=-arraySum(A,0,K-1)+arraySum(A,K,maxLessIndex)+arraySum(A,maxLessIndex+1,lenA-1);
            }else if(K==maxLessIndex+1){
                result=-arraySum(A,0,maxLessIndex)+arraySum(A,maxLessIndex+1,lenA-1);
            }else{
                result=-arraySum(A,0,maxLessIndex)+arraySum(A,maxLessIndex+2,lenA-1);
                int remainK =  K-maxLessIndex-1;
                if(remainK%2==0){
                    result+=A[maxLessIndex+1];
                }
                else{
                    if(-A[maxLessIndex]<A[maxLessIndex+1]){
                        result=result+A[maxLessIndex+1]+2*A[maxLessIndex];
                    }else{
                        result-=A[maxLessIndex+1];
                    }
                }
            }
            return result;
            
        }
        public int arraySum(int [] A, int start, int end){
            int sum = 0;
            for(int i=start;i<=end;i++){
                sum+=A[i];
            }
            return sum;
        }
    }
    

    解法三:

    class Solution {
        public int largestSumAfterKNegations(int[] A, int K) {
           java.util.Arrays.sort(A);
           int count=0;
           int sum=0;
           int lenA=A.length;
           int minNum=A[lenA-1];
           for(int i=0;i<lenA;i++){
               if(A[i]<0 && ++count<=K){
                   A[i]=-A[i];
               }
               minNum=Math.min(A[i],minNum);
               sum+=A[i];
           }
           if(count>K || (K-count)%2==0){
               return sum;
           }else{
               return sum-2*minNum;
           }
    
        }
    }
    

    注意:if(A[i]<0 && ++count<=K)这里别写成了++count

  • 相关阅读:
    navicat的快捷键
    NoSQL Redis的学习笔记
    awk的使用
    把自己的电脑做服务器发布tomcat的项目外网访问
    linux系统备份
    系统自动化配置和管理工具:SaltStack
    RSync实现文件备份同步
    传送文件
    面试题
    闭包closure
  • 原文地址:https://www.cnblogs.com/shely-Wangfan/p/10506423.html
Copyright © 2011-2022 走看看