刚看到这个题,想了半天没有思路,看到题解的贪心算法,顿时恍然大悟。
直接放代码吧
如果当前和为负,并且下个元素比当前和大,则放弃前面的元素,重新将下个元素置为当前和
1 #include <iostream>
2 #include <vector>
3
4 using namespace std;
5 //若当前和为负,则舍弃前边的数组,
6 class Solution {
7 public:
8 int maxSubArray(vector<int>& nums) {
9 if (nums.size() == 0) return 0;
10 else
11 {
12 if (nums.size() == 1) return nums[0];
13 else
14 {
15 int cur_sum = nums[0];//将数组第一个值,作为当前和与最大和
16 int max_sum = nums[0];
17 for (int i = 1; i < nums.size(); i++)
18 {
19 if ( (cur_sum <= 0) && (cur_sum<nums[i]) )//如果当前和小于0,并且小于下一个元素,则下个元素重置为当前和
20 {
21 cur_sum = nums[i];
22 }
23 else cur_sum += nums[i];
24 if (cur_sum>max_sum)
25 max_sum = cur_sum;
26 }
27 return max_sum;
28 }
29
30 }
31 }
32 };
33
34 int main()
35 {
36 Solution sol;
37 int max_sum;
38 vector<int> nums{ -2, 1, -3, 4, -1, 2, 1, -5, 4 };
39 max_sum = sol.maxSubArray(nums);
40 cout << max_sum << endl;
41
42 int u;
43 cin >> u;
44 return 0;
45 }