Leetcode.1191 K 次串联后最大子数组之和

Posted 感觉画质不如…原神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode.1191 K 次串联后最大子数组之和相关的知识,希望对你有一定的参考价值。

题目链接

Leetcode.1191 K 次串联后最大子数组之和 Rating : 1748

题目描述

给定一个整数数组 arr和一个整数 k,通过重复 k次来修改数组。

例如,如果 arr = [1, 2] , k = 3,那么修改后的数组将是 [1, 2, 1, 2, 1, 2]

返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0

由于 结果可能会很大,需要返回的 1 0 9 + 7 10^9 + 7 109+7

示例 1:

输入:arr = [1,2], k = 3
输出:9

示例 2:

输入:arr = [1,-2,1], k = 5
输出:2

示例 3:

输入:arr = [-1,-2], k = 7
输出:0

提示:

  • 1 < = a r r . l e n g t h < = 1 0 5 1 <= arr.length <= 10^5 1<=arr.length<=105
  • 1 < = k < = 1 0 5 1 <= k <= 10^5 1<=k<=105
  • − 1 0 4 < = a r r [ i ] < = 1 0 4 -10^4 <= arr[i] <= 10^4 104<=arr[i]<=104

解法:前缀和 + 贪心

分情况讨论:

  • 当最大子数组 只位于单个数组内 时,此时 最大和 就为单个数组内的最大子数组和。
  • 当最大子数组 横跨两个数组 时,此时 最大和 就为 第一个数组的最大后缀和 + 第二个数组的最大前缀和
  • 当最大子数组 横跨多个数组 时,此时 单个数组的和肯定是大于 0的,此时 最大和 就为 第一个数组的最大后缀和 + (k - 2)个数组的数组和 + 最后一个数组的最大前缀和

如何计算一个数组内的最大子数组和

时间复杂度: O ( n ) O(n) O(n)

C++代码:

const int MOD = 1e9 + 7;
using LL = long long;

class Solution 
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) 
        int n = arr.size();

        //前缀和 最大前缀和 最小前缀和
        LL preSum = 0,maxPreSum = 0, minPreSum = 0;
        //单个数组的最大数组和
        LL ans = 0;

        for(auto x:arr)
            preSum += x;
            minPreSum = min(preSum,minPreSum);
            maxPreSum = max(preSum,maxPreSum);
            ans = max(ans,preSum - minPreSum);
        

        //后缀和  最大后缀和 
        LL suffixSum = 0 , maxSuffixSum = 0;

        for(int i = n - 1;i >= 0;i--)
            suffixSum += arr[i];
            maxSuffixSum = max(suffixSum,maxSuffixSum);
        

        //1.单个数组的最大和 即 ans

        //2.两个数组的最大和 即第一个数组的最大后缀和 + 第二个数组的最大前缀和
        if(k >= 2) ans = max(ans,maxPreSum + maxSuffixSum);

        //3.多个数组的最大和 单个数组和 > 0 , 即第一个数组的最大后缀和 + (k-2)个数组的和 + 最后
        //一个数组的最大前缀和
        if(k >= 3 && preSum > 0) ans = max(ans , maxSuffixSum + (k-2)*preSum + maxPreSum);

        return (int)(ans % MOD);
    
;


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 }

 

以上是关于Leetcode.1191 K 次串联后最大子数组之和的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 1191. K-Concatenation Maximum Sum

2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元

能被 K 整除的最大连续子串长度

数组中最大元素的最小化

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

leetcode K 次取反后最大化的数组和