算法学习之路:打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
 

这种题目一看就是使用动态规划来做,已知如果房子只有一间,则偷这一间为最大值,如果房子只有两间,则偷其中金额较大的一间为最大值,如果大于两间,则第i个房屋所能获得的最大金额为第i-1个房屋或者第i-2个房屋所能获得的最大金额+第i个房屋的金额,即:max[i] = Math.max(max[i-1],max[i-2]+int[i])

public int rob(int[] nums) {
        if (nums.length == 0){
            return 0;
        }else if (nums.length == 1){
            return nums[0];
        } else if (nums.length == 2) {
            return Math.max(nums[0],nums[1]);
        }else {
            nums[1] = Math.max(nums[0],nums[1]);
            for (int i = 2; i < nums.length; i++){
                nums[i] = Math.max(nums[i-1],nums[i-2]+nums[i]);
            }
            return nums[nums.length-1];
        }
    }

我在上式的动态规划中做了改良,直接使用入参的数组作为存储的媒介,这样虽然减少了空间复杂度但是破坏了入参的完整性,如果有需要的话可以使用数组(空间复杂度O(n)将所有偷取方案都保存下来,可以比较直观的看出偷取路径)或者滚动数组(空间复杂度O(1),由于只使用到了i-1和i-2这两个位置的数,所以只要存储这两个位置的值就够了)来解决该方法,具体代码就不展示了。

你可能感兴趣的:(动态规划,leetcode)