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)