子数组最大累加和+子矩阵的最大和+子数组累加和为给定值的最大子数组长度
来源:互联网 发布:轩墨宝宝 知乎 编辑:程序博客网 时间:2024/05/22 08:10
1.如何求一个子数组的最大累加和?(时间复杂度O(N))
class Solution{public:int SubArrayMaxSum(int *a, size_t n){if ((a == NULL) || (n == 0))return 0;int max = a[0];int cur = 0;for (size_t i = 0; i < n; i++){cur += a[i];max = (max>cur ? max : cur); //当max > cur时,需要更新maxif (cur < 0)cur = 0; //当cur < 0 时,需要将cur置0。}return max;}};
2.如何求两个子数组的最大累加和?(要求两个子数组无重合的部分,时间复杂度O(N))
class Solution{public:int SubArrayMaxSum(int *a, size_t n){if ((a == NULL) || (n < 1))return 0;int maxR = a[n - 1];int curR = a[n - 1];vector<int> maxSubSumR;maxSubSumR.push_back(maxR);int maxSubSum = a[0];int cur = a[0];for (int i = n - 2; i >= 0; i--){curR += a[i];maxR = (maxR > curR ? maxR : curR); //当max > cur时,需要更新maxmaxSubSumR.push_back(maxR);if (curR < 0)curR = 0; //当cur < 0 时,需要将cur置0。}int max = a[0] + maxSubSumR[n - 2];int j = 1;for (int i = n - 3; i >= 0; i--){cur += a[j];maxSubSum = (maxSubSum>cur ? maxSubSum : cur);max = (max > (maxSubSum + maxSubSumR[i]) ? max : (maxSubSum + maxSubSumR[i]));j++;if (cur < 0)cur = 0;}return max;}};
3.未排序的正数数组中累加和为给定值的最长子数组长度(时间复杂度O(N))
class Solution {public:int SubArrayMaxLegth(int* a, int n, int key){if (a == NULL || n < 0 || key < 0)return -1;int left = -1;int length = 0;int maxLength = 0;int right = -1;int sum = 0;//循环结束的条件left==right&& left==n-1||right > n-1while ((left != right) || (left != n - 1)){if (sum > key){left++;sum -= a[left];length--;}else{if (sum == key){maxLength = maxLength > length ? maxLength : length;}right++;length++;if (right > n - 1)break;sum += a[right];}}return maxLength;}};
4.子矩阵的最大和问题求解
#define M 100#define N 100class Solution{public:int SubMatrixMax(int a[4][4], int m, int n){if (a == NULL)return 0;int SubMatrixValue[M][N] = { 0 };//SubMatrixValue数组的大小可以根据m*n二维数组的大小来确定for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (i == 0)SubMatrixValue[i][j] = a[i][j];elseSubMatrixValue[i][j] = SubMatrixValue[i - 1][j] + a[i][j];}}//求出了1——>m行每一列的子数组中每一列的和int max = SubMatrixValue[0][0];int cur = SubMatrixValue[0][0];for (int k = -1; k < m; k++){for (int i = k + 1; i < m; i++){if (k != -1){for (int j = 0; j < n; j++){SubMatrixValue[i][j] -= SubMatrixValue[k][j];}}cur = SubMatrixValue[i][0];for (int j = 0; j < n; j++){if (i != 0)cur += SubMatrixValue[i][j];elsecur = SubMatrixValue[i][0];if (cur > max)max = cur;if (cur < 0)cur = 0;}}}return max;}};
阅读全文
0 0
- 子数组最大累加和+子矩阵的最大和+子数组累加和为给定值的最大子数组长度
- 【算法】子数组的最大累加和/子矩阵的最大累加和问题
- 子数组的最大累加和问题
- 子数组的最大累加和问题
- 子数组最大的累加和
- 子数组的最大累加和
- 子数组的最大累加和问题
- python---子数组的最大累加和
- 子数组的最大累加和问题
- 数组与矩阵---子矩阵的最大累加和问题
- 给定一个数组,返回最大子数组的累加和并且返回该子数组
- 求两个子数组最大的累加和
- 求两个子数组最大的累加和
- 有关子数组最大累加和的算法小结
- 子矩阵的最大累加和问题
- 子矩阵的最大累加和
- python---子矩阵的最大累加和
- 给定数组的子数组最大和
- 关于字符编码 GB2312,UTF-8,GBK,BIG5
- 【20170630】TensorFlow与python学习(2)-Mnist入门
- c语言之宏定义
- Pluraform Floating Park 嵌入场所
- Springboot整合druid的具体过程
- 子数组最大累加和+子矩阵的最大和+子数组累加和为给定值的最大子数组长度
- hdu5114 Collision (扩展欧几里德+思维)
- 100多个经典常用的PHP功能插件大全实例演示和下载
- Ignite 消息和事件
- lua table简单使用
- 4个数和为0
- 2010 成都Regional H 博弈,概率dp
- 白话讲MyIsam和InnoDB的区别
- 面向过程和面向对象的二级菜单转变