目录
- 14. 最长公共前缀
- 128. 最长连续序列
- 718. 最长重复子数组
- 169. 多数元素
- 662. 二叉树最大宽度
- 179. 最大数
- 122. 买卖股票的最佳时机 II
- 62. 不同路径
- 226. 翻转二叉树
- 227. 基本计算器 II
14. 最长公共前缀
题目链接
Python
解法一
class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:if not strs:return ""min_str = min(strs)max_str = max(strs)for i in range(len(min_str)):if min_str[i]!=max_str[i]:return min_str[:i]return min_str
解法二
class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:s=""for t in zip(*strs):if len(set(t))==1: s+=t[0]else:breakreturn s
zip(*iterables)
:创建一个聚合了来自每个可迭代对象中的元素的迭代器。 返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。 当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。 当只有一个可迭代对象参数时,它将返回一个单元组的迭代器。 不带参数时,它将返回一个空迭代器。
strs = ["flower", "flow", "flight"]
for i in zip(*strs):print(i)
输出
('f', 'f', 'f')
('l', 'l', 'l')
('o', 'o', 'i')
('w', 'w', 'g')
128. 最长连续序列
题目链接
Python
class Solution:def longestConsecutive(self, nums: List[int]) -> int:# 哈希表法longest_streak=0nums_set=set(nums)for num in nums_set:if num-1 not in nums_set:current_num=numcurrent_streak=1while current_num+1 in nums_set:current_streak+=1current_num+=1longest_streak=max(longest_streak,current_streak)return longest_streak
如果已知有一个 x,x+1,x+2,⋯ ,x+y 的连续序列,而我们却重新从 x+1,x+2或者是 x+y 处开始尝试匹配,那么得到的结果肯定不会优于枚举 x为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。
那么怎么判断是否跳过呢?由于我们要枚举的数 x 一定是在数组中不存在前驱数 x−1 的,不然按照上面的分析我们会从x−1 开始尝试匹配,因此我们每次在哈希表中检查是否存在x−1 即能判断是否需要跳过了。
718. 最长重复子数组
题目链接
Python
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:# dp[i][j]:以下标i-1为结尾的nums1和以下标j-1为结尾的nums2的最长重复子数组的长度m=len(nums1)n=len(nums2)# dp=[[0]*(n+1) for _ in range(m+1)]dp=[[0 for _ in range(n+1)] for _ in range(m+1)]res=0for i in range(1,m+1):for j in range(1,n+1):if nums1[i-1]==nums2[j-1]:dp[i][j]=dp[i-1][j-1]+1res=max(res,dp[i][j])return res
注意区别于 1143. 最长公共子序列
169. 多数元素
题目链接
Python
class Solution:def majorityElement(self, nums: List[int]) -> int:votes=0for num in nums:if votes==0:x=numvotes+= 1 if num==x else -1return x
参考题解 摩尔投票。
662. 二叉树最大宽度
题目链接
Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:ans=1arr=[[root,1]]while arr:temp=[]for node,index in arr:if node.left:temp.append([node.left,index*2])if node.right:temp.append([node.right,index*2+1])ans=max(ans,arr[-1][1]-arr[0][1]+1)arr=tempreturn ans
179. 最大数
题目链接
Python
class Solution:def largestNumber(self, nums: List[int]) -> str:"""由于a+b与b+a等长拼接得到的字符串结果更大的话,那么原本的整型的数字拼接结果也一定更大"""strs = list(map(str, nums))def cmp(a,b):if a+b==b+a:return 0if a+b>b+a:return 1if a+b<b+a:return -1strs.sort(key=functools.cmp_to_key(cmp),reverse=True)return "".join(strs) if strs[0]!="0" else "0"
122. 买卖股票的最佳时机 II
题目链接
Python
class Solution:def maxProfit(self, prices: List[int]) -> int:# dp[i][0]不持有,dp[i][1]持有dp=[[0,0] for _ in range(len(prices))]dp[0][1]=-prices[0]for i in range(1,len(prices)):dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i])dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])return dp[len(prices)-1][0]
62. 不同路径
题目链接
Python
class Solution:def uniquePaths(self, m: int, n: int) -> int:dp=[[0 for i in range(n)] for j in range(m)]for i in range(m):dp[i][0]=1for j in range(n):dp[0][j]=1for i in range(1,m):for j in range(1,n):dp[i][j]=dp[i-1][j]+dp[i][j-1]return dp[m-1][n-1]
226. 翻转二叉树
题目链接
Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if not root:return queue=[root]while queue:temp=[]for node in queue:node.left,node.right=node.right,node.leftif node.left:temp.append(node.left)if node.right:temp.append(node.right)queue=tempreturn root
227. 基本计算器 II
题目链接
Python
class Solution:def calculate(self, s: str) -> int:n=len(s)nums=[]preSign="+" # 初始化第一个数字的符号为“+”num=0for i,c in enumerate(s):if c.isdigit():num=num*10+int(c) # s中用于计算的数不一定只有一位数字if i==n-1 or c in "+-*/":if preSign=="+":nums.append(num)elif preSign=="-":nums.append(-num)elif preSign=="*":nums.append(nums.pop()*num)else: # 题目要求【整数除法仅保留整数部分】也就是直接截断,int# nums.append(nums.pop()//num))nums.append(int(nums.pop()/num))preSign=cnum=0return sum(nums)
注意:python易错知识点之int取整和//取整