hot100练习-8
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:n = len(s)dp = [False] * (n+1)dp[0] = Truefor i in range(n):for j in range(i+1, n+1):if dp[i] and (s[i:j] in wordDict):dp[j] = Truereturn dp[-1]
思路:先都初始化为False,如果前i个字符为True,而且i到j-1是在字典里面,就True,返回dp[-1]
class Solution:def singleNumber(self, nums: List[int]) -> int:ans = 0for num in nums:ans ^= numreturn ans
思路就是利用异或,不同整数的二进制不同,两个相同的二进制异或完就0,遍历数组异或下去,得到的结果就是只有一个的元素
class Solution:def countSubstrings(self, s: str) -> int:n = len(s)dp = [[False] * n for _ in range(n)]ans = 0for i in range(n - 1, -1, -1):for j in range(i, n):if s[i] == s[j]:if j - i <= 1:ans += 1dp[i][j] = Trueelif dp[i + 1][j - 1]:ans += 1dp[i][j] = Truereturn ans
子问题就是动态规划,dp[i][j]表示下标从i到j是否为回文子串,状态转移方程为如果i j下标的元素相等,就要看往里面缩一圈的字串是不是回文子串,注意i只能从右往左遍历(j是紧跟着i,从i开始,是从左往右的),因为如果i是从左往右遍历的话是不行的,因为[i+1]是没有计算的。
class Solution:def longestConsecutive(self, nums: List[int]) -> int:h = set(nums)ans = 0for num in h:if num - 1 in h:continuek = num + 1while k in h:k += 1# 最后一个连续的数字是k-1ans = max(ans, k - num)return ans
不能排序的,因为排序的时间复杂度是 O(nlogn),用哈希,将数组转换为哈希且遍历,如果当前的值-1在哈希里面,那么就不是连续序列的开头,就直接continue,找到开头之后,while循环一直找到连续序列的末尾,更新连续序列长度的最大值,返回即可。
# 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 maxPathSum(self, root: Optional[TreeNode]) -> int:ans = -infdef dfs(node):if node is None:return 0left = dfs(node.left)right = dfs(node.right)nonlocal ansans = max(ans, left + right + node.val)return max(max(left , right) + node.val, 0)dfs(root)return ans
class Solution:def coinChange(self, coins: List[int], amount: int) -> int:m = len(coins)dp = [[inf] * (amount + 1) for _ in range(m + 1)]dp[0][0] = 0for i, c in enumerate(coins):for a in range(amount+1):if a < c:dp[i+1][a] = dp[i][a]else:dp[i+1][a] = min(dp[i][a], dp[i+1][a-c] + 1)ans = dp[m][amount]return ans if ans < inf else -1
dp[i][j]代表的是用前 i
种硬币凑出金额j的最少硬币数量,如果当下金额小于当前硬币,则不能使用该硬币,如果不小于,则找(选择和不选择该硬币)的最小值,最后返回ans = dp[m][amount]