第198题(打家劫舍)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
解答:很经典的一道动态规划(dp)题,重点就是判断当前房间该不该偷:dp 方程 dp[i] = max(dp[i-2]+nums[i], dp[i-1])
class Solution:
def rob(self, nums: List[int]) -> int:
if nums==[] :
return 0
if len(nums)==1:
return nums[0]
if len(nums)==2:
if nums[1]>nums[0]:
return nums[1]
else:
return nums[0]
max1=[0 for _ in range(len(nums))]
max1[0]=nums[0]
max1[1]=max(nums[1],nums[0])
for i in range(2,len(nums)):
if nums[i]+max1[i-2]>max1[i-1]:
max1[i]=nums[i]+max1[i-2]
else:
max1[i]=max1[i-1]
return max1[-1]
第31题(下一个排列,选自热题hot100)
重点就是理解什么是字典序:
(百度百科)在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法。 这种泛化主要在于定义有序完全有序集合(通常称为字母表)的元素的序列(通常称为计算机科学中的单词)的总顺序。
对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
设想一本英语字典里的单词,何者在前何者在后?
显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。
通过这种方法,我们可以给本来不相关的单词强行规定出一个顺序。“单词”可以看作是“字母”的字符串,而把这一点推而广之就可以认为是给对应位置元素所属集合分别相同的各个有序多元组规定顺序。
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
for i in range(n - 2, -1, -1): //倒数第二个开始
if nums[i] < nums[i + 1]:
nums[(i + 1):] = sorted(nums[(i + 1):])
for j in range(i + 1, n):
if nums[i] < nums[j]:
nums[i], nums[j] = nums[j], nums[i]
break
return nums
nums.sort() //其实就是字典序中倒数第一再变到第一去