首页 > 其他分享 >子数组最大累加和

子数组最大累加和

时间:2025-01-10 13:33:39浏览次数:1  
标签:最大 nums int 累加 vector 数组 dp size

[Algo] 子数组最大累加和

1. 最大子数组和i

// 1. 最大子数组和i
// https://leetcode.cn/problems/maximum-subarray/description/
int maxSubArray(vector<int>& nums) {
    vector<int> dp(nums.size()); // dp[i] - 以i位置作为结尾的最大子数组和
    dp[0] = nums[0];
    for (int i = 1; i < dp.size(); i++) dp[i] = max(nums[i], nums[i] + dp[i - 1]);
    int ans = INT32_MIN;
    for (int i = 0; i < dp.size(); i++) ans = max(ans, dp[i]);
    return ans;
}

2. 最大子数组和ii

// 2. 最大子数组和ii
// 返回如下三个信息:
// 1) 最大累加和子数组的开头left
// 2) 最大累加和子数组的结尾right
// 3) 最大累加和子数组的累加和sum
// 如果不止一个子数组拥有最大累加和,那么找到哪一个都可以
vector<int> maxSubArr(vector<int>& nums)
{
    int left, right, sum = INT32_MIN;
    for (int i = 0, l = 0, r = 0, pre = INT32_MIN; i < nums.size(); i++)
    {
        if (pre <= 0) { l = i; r = i; pre = nums[i]; }
        else { r++; pre += nums[i]; }
        if (pre > sum) { left = l; right = r; sum = pre; }
    }
    vector<int> ans = {left, right, sum};
    return ans;
}

3. 数组中不能选相邻元素的最大累加和

// 3. 数组中不能选相邻元素的最大累加和
// https://leetcode.cn/problems/house-robber/description/
int rob(vector<int>& nums) {
    if (nums.size() == 1) return nums[0];
    vector<int> dp(nums.size()); // dp[i] - nums[0...i]不能选相邻元素的最大累加和
    dp[0] = nums[0];
    dp[1] = max(nums[0], nums[1]);
    for (int i = 2; i < nums.size(); i++)
    dp[i] = max(dp[i - 1], max(nums[i], dp[i - 2] + nums[i]));
    return dp[nums.size() - 1];
}

4. 环形数组的子数组最大累加和

// 4. 环形数组的子数组最大累加和
// https://leetcode.cn/problems/maximum-sum-circular-subarray/description/
int maxSubarraySumCircular(vector<int>& nums) {
    int maxSum = INT32_MIN, maxPre = INT32_MIN, minSum = INT32_MAX, minPre = INT32_MAX, all = 0;
    for (int i = 0; i < nums.size(); i++)
    {
        all += nums[i];
        if (maxPre < 0) maxPre = nums[i];
        else maxPre += nums[i];
        maxSum = max(maxSum, maxPre);
        if (minPre > 0) minPre = nums[i];
        else minPre += nums[i];
        minSum = min(minSum, minPre);
    }
    // maxSum: 普通子数组最大累加和, all - minSum: 环状子数组最大累加和
    return minSum == all ? maxSum : max(maxSum, all - minSum); // !!!
}

5. 打家劫舍 IV

// 5. 打家劫舍 IV
// https://leetcode.cn/problems/house-robber-iv/
int mostRob1(vector<int>& nums, int capability)
{
    // 动态规划
    int n = nums.size();
    if (n == 1) return nums[0] <= capability ? 1 : 0;
    vector<int> dp(n);
    dp[0] = nums[0] <= capability ? 1 : 0;
    dp[1] = (nums[0] <= capability || nums[1] <= capability) ? 1 : 0;
    for (int i = 2; i < n; i++)
    dp[i] = max(dp[i - 1], nums[i] <= capability ? 1 + dp[i - 2] : 0);
    return dp[n - 1];
}
int mostRob2(vector<int>& nums, int capability)
{
    // 贪心策略
    int ans = 0;
    for (int i = 0; i < nums.size();)
    {
        if (nums[i] <= capability) { ans++; i += 2; }
        else i++;
    }
    return ans;
}
int minCapability(vector<int>& nums, int k) {
    int n = nums.size(), minVal = INT32_MAX, maxVal = INT32_MIN;
    for (int i = 0; i < n; i++) { minVal = min(minVal, nums[i]); maxVal = max(maxVal, nums[i]); }
    int l = minVal, r = maxVal, mid, ans;
    while (l <= r)
    {
        mid = l + (r - l) / 2;
        if (mostRob2(nums, mid) >= k) { ans = mid; r = mid - 1; }
        else l = mid + 1;
    }
    return ans;
}

6. 子矩阵最大累加和

// 6. 子矩阵最大累加和
// https://leetcode.cn/problems/max-submatrix-lcci/
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
    int n = matrix.size(), m = matrix[0].size();
    vector<int> cur(m);
    int maxSum = INT32_MIN, r1, c1, r2, c2;
    for (int i = 0; i < n; i++)
    {
        fill(cur.begin(), cur.end(), 0);
        for (int j = i; j < n; j++)
        {
            for (int k = 0; k < m; k++) cur[k] += matrix[j][k];
            vector<int> ans = maxSubArr(cur);
            int left = ans[0], right = ans[1], sum = ans[2];
            if (sum > maxSum) { maxSum = sum; r1 = i; c1 = left; r2 = j; c2 = right; }
        }
    }
    vector<int> result = {r1, c1, r2, c2};
    return result;
}

标签:最大,nums,int,累加,vector,数组,dp,size
From: https://www.cnblogs.com/yaoguyuan/p/18663803

相关文章

  • 如何修改PHP最大文件上传大小限制
    默认情况下,PHP上传文件大小限制是2M,超过2M上传将会报错。如果我们上传的图片或压缩包超过2M,需要修改PHP的配置文件最大上传限制。找到PHP组件目录下的php.ini文件,使用记事本打开,查找post_max_size(允许POST数据大小)值修改成10M或更大,查找upload_max_filesize(允许上传文件大小)值,可......
  • 关于结构体数组取地址
    关于结构体数组:当我们定义一个结构体数组,然后数组长度是,然后我们定义一个函数,函数的参数是结构体指针当调用该函数时,如果直接使用取结构体数组变量地址会提示参数类型错误原因:通常我们在用数组的时候都喜欢用数组名作为数组首地址使用,然后这里结构体数据我也是默认这么想的,但是......
  • 189. 轮转数组
    [题目链接](189.轮转数组-力扣(LeetCode))解题思路:直接举例子,nums=[1,2,3,4,5,6,7],k=3,步骤:先把5,6,7安排好,即5,6,7,4,1,2,3这是怎么来的?其实可以想象成两部分,一部分是1,2,3,4,另一部分是5,6,7先分别交换,1和5,2和6,3和7。然后5,6,7就已经完成了。剩下的部分就是4,1,2,3怎么操作......
  • 数组
    数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下表来访问他们数组声明创建首先必须声明数组变量,才能在程序中使用数组。下面:dataType[]arrayRefVar;//首选......
  • 检测相邻递增子数组 II - LeetCode 3350 解题思路与代码解析
    检测相邻递增子数组II-LeetCode3350解题思路与代码解析在本篇博客中,我们将深入解析一道中等难度的算法题——检测相邻递增子数组II。通过这道题,我们将学习如何高效地处理数组中的递增子数组问题,并理解解决该问题的最佳策略。题目描述给定一个由n个整数组成的数组......
  • 179. 最大数
    [题目链接](179.最大数-力扣(LeetCode))解题思路:x拼接y大于y拼接x后,那么x就应该放前面。自定义排序就行了。还要注意把前导0给去掉代码classSolution:defmyCompare(self,x,y):#比较两个字符串拼接后的结果ifstr(x)+str(y)>str(y)......
  • 树状数组
    回顾一下以前不太明白的树状数组原理。以@Gcint-since2024大佬做的总结为参考。\(lowbit(x)\)表示\(x\)在二进制表示下从右往左第一个\(1\)及其后所有的\(0\)构成的数。记\(a[x]\)为原数组,\(tree[x]\)为树状数组:定义\(tree[x]\)表示以\(a[x]\)结尾,长度为......
  • 2264. 字符串中最大的 3 位相同数字
    给你一个字符串 num ,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 :该整数是 num 的一个长度为 3 的 子字符串 。该整数由唯一一个数字重复 3 次组成。以字符串形式返回 最大的优质整数 。如果不存在满足要......
  • 152. 乘积最大子数组
    [题目链接](152.乘积最大子数组-力扣(LeetCode))解题思路:子数组问题,考虑【以i结尾】结果是什么,求出所有的结果,最大的那个就是结果。【以i结尾】结果是什么?我们可以利用【i-1】计算过的内容。nums[i]如果是0,那么结果就是0nums[i]如果大于0,那么我们就希望得到【以i-1结尾......
  • 242有效的字母异位词 349. 两个数组的交集 202快乐数
    这几道都比较简单,主要是熟悉哈希的操作classSolution{public:boolisAnagram(strings,stringt){intalphab[26]={0};for(inti=0;i<s.size();i++){alphab[s[i]-'a']++;}for(inti=0;i<t......