198. House Robber抢劫房子Python & Java

list中求不相邻的数的和的最大值。

下面是leetcode不学好,叫程序员抢劫的原话:

你是一个计划抢劫沿街房屋的职业抢劫犯。每所房子都有一定数量的现金,阻止你抢劫的唯一限制是相邻的房子都有连接的安全系统,如果两个相邻的房子在同一个晚上被闯入,它会自动联系警察。
给定一个表示每所房子的钱的非负整数列表,确定今晚你可以在不报警的情况下抢劫的最大金额。

Input:[2,7,9,3,1]

Output:12(2+9+1)

Input:[2,1,1,2]

Output:4

开始只想隔一个相加求和取最大值然后不对,因为像[2,1,1,2]这种不是隔一个相加得到最大值的。

然后想到了之前做的53题取最大的连续子集,感觉有一丢丢类似。

Clue:cur=max(sum(nums[i-1]),nums[i]+sum(nums[i-2]))

class Solution:
    def rob(self, nums: List[int]) -> int:
        cur=pre=0
        for i in nums:
            _=pre
            pre=cur
            cur=max(i+_,pre)
        return cur
'''
i _ p cur
3 0 0 3
1 3 3 3
1 3 3 4
1 4 4 4
1 4 4 5
5 5 5 9
'''

下面注释里的每次循环结果以nums[3,1,1,1,1,5]为例子,第一列是i第二列是_以此类推

Java 

原理和python方法相同, Math.max( [i-1],[i]+[i-2] )  初始结果和pre([i-1])设置为0

class Solution {
    public int rob(int[] nums) {
       int pre=0,res=0;
        for (int i : nums) {
            int temp=pre;
            pre = res;
            res = Math.max(pre, i + temp);
        }
        return res; 
    }
}

时间复杂度O(n)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值