一、动态规划
53 最大子序和
- 典型的「动态规划」问题,掌握动态规划问题设计状态的技巧,并且需要知道如何推导状态转移方程;
- 最后再去优化空间。
(1)双指针暴力解法
比较容易想到的是用“暴力解法”做,即穷举所有的子区间。思路虽然简单,但是写好暴力解法也不是一件容易的事情。
- 使用双层循环,穷举所有的子区间;
- 然后再对子区间内的所有元素求和;
- 时间复杂度是立方级别的。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
#类似双指针
if len(nums) == 1: return int(nums[0])
maxSum = nums[0]
i = 0
while i < len(nums):
tmp = nums[i]
for j in range(i + 1, len(nums)):
if nums[j] + tmp < nums[j]:
i = j
maxSum = max(nums[j], maxSum)
break
else:
tmp = nums[j] + tmp
maxSum = max(maxSum, tmp)
if j == len(nums) - 1:
break
return maxSum
(2)动态规划
状态转移方程:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
dp=[0]*len(nums)
dp[0]=nums[0]
for i in range(1,len(nums)):
dp[i]=max(nums[i],dp[i-1]+nums[i])
return max(dp)
300. 最长上升子序列
状态转移方程为:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
if not nums:
return 0
dp = []
for i in range(len(nums)):
dp.append(1)
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
70. 爬楼梯
dp[n] = dp[n-1]+dp[n-2]
class Solution:
def climbStairs(self, n: int) -> int:
if n <=2:
return n
dp = [0]*n
dp[0] = 1
dp[1] = 2
for i in range(2,n):
dp[i] = dp[i-1]+dp[i-2]
return dp[n-1]
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2:
return n
a = 1
b = 2
for i in range(3,n+1):
t = b
b = a + b
a = t
return b
242. 有效的字母异位词
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 集合
if len(s) != len(t):
return False
set1=set(s)
for i in set1:
if s.count(i) != t.count(i):
return False
return True
# 哈希表
class Solution():
def isAnagram(self, s, t):
# 哈希表
if len(s) != len(t):
return False
count = {}
for char in s:
print(char)
if char in count:
count[char] += 1
else:
count[char] = 1
print(count)
for char in t:
if char in count:
count[char] -= 1
else:
return False
for value in count.values():
print(value)
if value != 0:
return False
return True
if __name__=='__main__':
# anagram,nagaram
s,t=list(map(str,input().split(',')))
print(s)
print(t)
print(Solution().isAnagram(s,t))
463. 岛屿的周长
class Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
count = 0
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] == 1:
if i + 1 >= len(grid) or grid[i+1][j] == 0:
count += 1
if i - 1 < 0 or grid[i-1][j] == 0:
count += 1
if j + 1 >= len(grid[i]) or grid[i][j+1] == 0:
count += 1
if j - 1 < 0 or grid[i][j-1] == 0:
count += 1
return count
class Solution:
# 哈希
def longestPalindrome(self, s: str) -> int:
count = {}
for i in s:
if i in count:
count[i] += 1
else:
count[i] = 1
number = 0
odd = 0
for i in count:
if count[i] % 2 == 0:
number += count[i]
else:
number += (count[i] - 1)
odd = 1
return int(number + odd)
文章与视频资源多平台更新
微信公众号|知乎|B站|头条:AI研习图书馆
深度学习、大数据、IT编程知识与资源分享,欢迎关注,共同进步~