NC302. 环形数组的连续子数组最大和
描述
给定一个长度为 的环形整数数组 ,返回 的非空 连续子数组 的最大可能和 。示例1
输入:
[6,-3,6]
输出:
12
说明:
从子数组 [6,6] 得到最大和 6 + 6 = 12示例2
输入:
[4,-2,2,-4]
输出:
4
说明:
从子数组 [4] 和 [4,-2,2] 都可以得到最大和 4C++ 解法, 执行用时: 19ms, 内存消耗: 3140KB, 提交时间: 2022-03-12
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int maxSubarraySumCircular(vector<int>& nums) { // write code here int n = nums.size(); // 无环的最大和 int res = INT_MIN, sum = 0; for (int i = 0, last = 0; i < n; i ++ ) { sum += nums[i]; last = max(last, 0) + nums[i]; res = max(res, last); } int res2 = INT_MAX; for (int i = 0, last = 0; i < n; i ++ ) { last = min(last, 0) + nums[i]; res2 = min(res2, last); } if (res < 0) return res; return max(res, sum - res2); } };
C++ 解法, 执行用时: 19ms, 内存消耗: 3272KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int maxSubarraySumCircular(vector<int>& nums) { // write code here int n=nums.size(); int res=INT_MIN,sum=0; for(int i=0,last=0;i<n;i++) { sum+=nums[i]; last=max(last,0)+nums[i]; res=max(res,last); } int res2=INT_MAX; for(int i=0,last=0;i<n;i++) { last=min(last,0)+nums[i]; res2=min(res2,last); } if(res<0) return res; return max(res,sum-res2); } };
C 解法, 执行用时: 20ms, 内存消耗: 3132KB, 提交时间: 2022-06-16
int min(int i, int j) { return i > j ? j : i; } int max(int i, int j) { return i > j ? i : j; } int maxSubarraySumCircular(int* nums, int numsLen ) { int sum = nums[0]; int x = nums[0]; int y = nums[0]; int* p; p = (int*)malloc(numsLen * sizeof(int)); p[0] = nums[0]; for (int i = 1, z = nums[0]; i < numsLen; i++) { sum += nums[i]; p[i] = max(nums[i] + p[i - 1], nums[i]); x = max(p[i], x); z = min(z, 0) + nums[i]; y = min(y, z); } if (x < 0) return x; return max(x, sum - y); }
C++ 解法, 执行用时: 20ms, 内存消耗: 3136KB, 提交时间: 2022-04-16
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int maxSubarraySumCircular(vector<int>& nums) { // write code here int n = nums.size(), sum = 0, maxSum = INT_MIN, minSum = INT_MAX; for (auto n : nums) { sum += n; } // 无环情况下连续数组的最大和 for (int i=0, lastSum=0; i<n; ++i) { lastSum = max(lastSum, 0) + nums[i]; maxSum = max(maxSum, lastSum); } // 无环情况下连续数组的最小和 for (int i=0, lastSum=0; i<n; ++i) { lastSum = min(lastSum, 0) + nums[i]; minSum = min(minSum, lastSum); } if (maxSum < 0) { return maxSum; } return max(maxSum, sum - minSum); return 0; } };
C++ 解法, 执行用时: 20ms, 内存消耗: 3140KB, 提交时间: 2022-07-10
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int maxSubarraySumCircular(vector<int>& nums) { // write code here int n = nums.size(); int sum = 0, cnt = 0, minv = 0x3f3f3f3f; int cnt1 = 0, maxv = 0x9f9f9f9f; for (int i = 1; i <= n; i ++) { sum += nums[i-1]; cnt = min(nums[i - 1], cnt + nums[i - 1]); cnt1 = max(nums[i - 1], cnt1 + nums[i - 1]); minv = min(minv, cnt); maxv = max(maxv, cnt1); } if (sum == minv) return maxv; return max(maxv, sum - minv); } };