2
2
* @Author: Chacha
3
3
* @Date: 2022-04-18 14:53:00
4
4
* @Last Modified by: Chacha
5
- * @Last Modified time: 2022-04-18 15:19:30
5
+ * @Last Modified time: 2022-04-22 13:48:28
6
6
*/
7
7
8
8
/* *
@@ -42,10 +42,12 @@ class Solution
42
42
/* data */
43
43
public:
44
44
int maxSubArray (vector<int > &nums);
45
+
46
+ int maxSubArray1 (vector<int > &nums);
45
47
};
46
48
47
49
/* *
48
- * 贪心解法
50
+ * 方法一: 贪心解法
49
51
*
50
52
* 贪心贪的是哪里呢?如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方。
51
53
*
@@ -60,6 +62,9 @@ class Solution
60
62
* if (count > result) result = count;
61
63
* 这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)。
62
64
*
65
+ * 时间复杂度:O(n)
66
+ * 空间复杂度:O(1)
67
+ *
63
68
*/
64
69
int Solution::maxSubArray (vector<int > &nums)
65
70
{
@@ -86,6 +91,30 @@ int Solution::maxSubArray(vector<int> &nums)
86
91
return result;
87
92
};
88
93
94
+ int Solution::maxSubArray1 (vector<int > &nums)
95
+ {
96
+ if (nums.size () == 0 )
97
+ {
98
+ return 0 ;
99
+ }
100
+
101
+ vector<int > dp (nums.size (), 0 ); // dp[i] 表示包括 i 之前的最大连续子序列和
102
+ dp[0 ] = nums[0 ];
103
+ int result = dp[0 ];
104
+
105
+ for (int i = 1 ; i < nums.size (); i++)
106
+ {
107
+ dp[i] = max (dp[i - 1 ] + nums[i], nums[i]); // 状态转移方程
108
+
109
+ if (dp[i] > result)
110
+ {
111
+ result = dp[i]; // result 保存 dp[i] 的最大值
112
+ }
113
+ }
114
+
115
+ return result;
116
+ };
117
+
89
118
int main (int argc, char const *argv[])
90
119
{
91
120
Solution s;
@@ -95,5 +124,8 @@ int main(int argc, char const *argv[])
95
124
std::cout << " [-2, 1, -3, 4, -1, 2, 1, -5, 4]最大子数组和: " << s.maxSubArray (nums) << std::endl;
96
125
std::cout << " [5, 4, -1, 7, 8]最大子数组和: " << s.maxSubArray (nums1) << std::endl;
97
126
127
+ std::cout << " \n [-2, 1, -3, 4, -1, 2, 1, -5, 4]最大子数组和: " << s.maxSubArray1 (nums) << std::endl;
128
+ std::cout << " [5, 4, -1, 7, 8]最大子数组和: " << s.maxSubArray1 (nums1) << std::endl;
129
+
98
130
return 0 ;
99
131
}
0 commit comments