JAVA算法练习题day11
普通数组
13.最大子数组和
通过这题复习了动态规划4部曲。同时发现自己推导DP递推式时候的致命错误,累积了分析经验。
class Solution {public int maxSubArray(int[] nums) {//因为是求最大和的连续子数组。上一个状态(sum0)将影响到下一个状态的结果,动态规划//DP四部曲:DP数组的含义(数组本身以及下标),确定DP数组的递推式,DP数组初始化,确定遍历顺序,最后手动模拟DP数组//含义:DP[i]:以下标i为**结尾**的为某个连续子数组的最大和//递推式 dp[i] = max(dp[i-1],dp[i-1]+nums[i]) 不对,没有抓紧DP的含义。//针对每个位置,因为DP数组的含义,该位置的数字一定是要的,所以两种情况,1.要之前的和,2.不要之前的和。二者分别加上该数,取最大就好。int[] dp = new int[nums.length];int ans = 0;dp[0] = nums[0];ans = dp[0];for(int i = 1 ;i <nums.length ; i++){dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);ans = Math.max(dp[i],ans);}return ans;}
}
前缀和+贪心
复习前缀和:
图片来自“灵茶山艾府”[https://leetcode.cn/problems/range-sum-query-immutable/solutions/2693498/qian-zhui-he-ji-qi-kuo-zhan-fu-ti-dan-py-vaar/]
前缀和+贪心似乎把题目弄复杂了(对我来说更难理解此做法),就不研究了。
Python:
class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""#python的语法真的奇怪,我还得多学,现在只是看得懂代码,但是写不出来dp = [0] * len(nums)dp[0] = nums[0]for i in range(1,len(nums)):dp[i] = max(nums[i],nums[i]+dp[i-1])dp[0] = max(dp[i],dp[0])return dp[0]