Q1
:::info
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
:::
动态规划
- 对于一个数组Array任意下标i(i > 0),定义dp[i]为到下标i的最大子数组和:
int maxSubArray(vector<int>& nums) {int len = nums.size();if (len == 0){return 0;}int *dp = new int[len];dp[0] = nums[0];int maxSum = nums[0];for (int i = 1; i < len; i++){dp[i] = max(dp[i-1] + nums[i], nums[i]);maxSum = max(maxSum, dp[i]);}return maxSum;}
- 由于dp[i]只和dp[i-1]有关,上述写法可以优化,只需要定义一个变量用来描述dp[i-1]
int maxSubArray(vector<int>& nums) {int len = nums.size();if (len == 0){return 0;}int pre = 0;int maxSum = nums[0];for (int i = 0; i < len; i++){pre = max(pre + nums[i], nums[i]);maxSum = max(maxSum, pre);}return maxSum;}
