• 【数组】子数组/子矩阵的最大累加和问题


    之前有做过这类题,甚至有扩展版的子矩阵最大累加和问题,但隔了几个月不练习果然忘了基础不扎实。

    做了中国邮政商务运营中心的笔试题,都是很基础的题目。不过这道手写代码题我还是有点卡住了,想得太复杂。

    输入:一个整型数组,数组个数;

    输出:子数组的最大累加和。

    当时想的是用两个指针去限定子数组的范围,其实完全没必要啊。左边限定的指针右移后,结果必然只能更小,因为舍去的是正数。

    直接依次遍历一半,中途如果当前和小于0的话,舍掉前面那部分,后面重新求和;其中还要记录每次的当前和,并与下一次加上了下一个元素的和作对比,取最大。

    #include <iostream>
    #include <climits> //C++中的头文件
    
    using namespace std;
    
    int maxSumSubArr(int *arr, int n){
        if (arr == NULL || n < 1)
            return 0;
        int res = INT_MIN; //结果
        int cur = 0; //当前和    
        for (int i = 0; i < n; i++){
            cur += arr[i]; //直接依次加上
            res = max(res, cur);
            cur = cur < 0 ? 0 : cur;
        }
        return res;
    }
    
    int main(){
        int arr[] = {-2, 1, 3, -2, 1, -2, 1};
        cout << maxSumSubArr(arr, 7);
        return 0;      
    }

    关于子矩阵的最大累加和,同理子数组,把矩阵的行、列当作数组。

     1 int maxSumSubMatrix(vector<vector<int>> matrix){
     2     if (matrix.empty() || matrix.size() ==0 || matrix[0].size() == 0)
     3         return 0;
     4     int res = INT_MIN;
     5     int cur = 0;
     6     int *s = NULL; //累加数组
     7     for (int i = 0; i < matrix.size(); i++){
     8         s = new int[matrix[0].size()]; //每一列的最大累加和
     9         for (int j = i; j < matrix.size(); j++){
    10             cur = 0;
    11             for (int k = 0; k < matrix[0].size(); k++){
    12                 s[k] += matrix[j][k];
    13                 cur += s[k];
    14                 res = max(res, cur);
    15                 cur = cur < 0 ? 0 : cur;
    16             }
    17         }
    18     }
    19     return res;
    20 }
  • 相关阅读:
    转一篇:arp欺骗的原理和防御
    CF1209A Paint the Numbers
    字符串专题之KMP算法
    CF1209B Koala and Lights
    CF1217A Creating a Character
    CF1217B Zmei Gorynich
    各种模板
    开通博客园拉..
    汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单
    我也要学C语言第二十章:结构体类型变量,结构体数组
  • 原文地址:https://www.cnblogs.com/cnblogsnearby/p/5318525.html
Copyright © 2020-2023  润新知