补充力扣198打家劫舍(动态规划)-CSDN博客的滚动数组写法,只有小改动
原未使用滚动数组代码:
class Solution { public int rob(int[] nums) { int length = nums.length; if(nums == null || length == 0){ return 0; } if(length == 1){return nums[0];} int[] dp = new int[length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); for (int i = 2; i < length; i++){ dp[i] = Math.max(dp[i - 2] + nums[i] , dp[i-1]); } return dp[length - 1]; } }使用了数组存储结果。
考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。
即:只用两个变量滚动保存前两状态代替dp数组
看代码:
class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int length = nums.length; if (length == 1) { return nums[0]; } //区别从这里开始 int first = nums[0], second = Math.max(nums[0], nums[1]); for (int i = 2; i < length; i++) { int temp = second; second = Math.max(first + nums[i], second); first = temp; } return second; } }[ first , second , nums[i] ]滑动数组大致长这样
first:到 i-2 位置能偷到的最大金额
second:到 i-2 位置能偷到的最大金额
为什么要赋值给first ? 很好理解:数组向后滑动一位,则first即为上一次second的值同理:second是上一位nums[i]的值新的nums[i](其实是上一轮的num[i+1]了)
仿照第一轮:把temp赋值为现在数组的second,接着重复就行了