hot100-3
class Solution:def sortColors(self, nums: List[int]) -> None:p0 = p1 = 0for i, e in enumerate(nums):nums[i] = 2if e <= 1:nums[p1] = 1p1 += 1if e == 0:nums[p0] = 0p0 += 1
原地修改数组,就是先把当下的元素设为2,如果说之前的元素是<=1,那么把p1对应的元素设为1,因为这说明之前的元素是0或者1,而且p0<=p1,所以并不会多设置一个1,然后如果之前的元素==0,那么就把p0对应的元素设为0,p0和p1指的是0和1应该存在的位置
class Solution:def minDistance(self, word1: str, word2: str) -> int:m, n = len(word1), len(word2)f = [[0] * (n + 1) for _ in range(m + 1)]f[0] = list(range(n + 1))for i, x in enumerate(word1):f[i + 1][0] = i + 1for j, y in enumerate(word2):if x == y:f[i + 1][j + 1] = f[i][j]else:f[i + 1][j + 1] = min(f[i][j + 1], f[i + 1][j], f[i][j]) + 1return f[m][n]
以 word1 = "horse"
, word2 = "ros"
为例:
第一行就是f[0] = list(range(n + 1))
第一列就是f[i + 1][0] = i + 1
这是初始化,然后判断关系,如果当下x,y相等,那么直接 f[i + 1][j + 1] = f[i][j],没有变化,反之不相等,就三种情况:删除、插入、替换,然后找三种的最小值即
f[i + 1][j + 1] = min(f[i][j + 1], f[i + 1][j], f[i][j]) + 1
然后返回f[m][n]即可
class Solution:def climbStairs(self, n: int) -> int:if n <= 1:return 1dp = [0] * (n + 1)dp[1] = 1dp[2] = 2for i in range(3, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]
首先进行特殊值判断
然后初始值:dp[1] = 1 dp[2] = 2
如何达到i台阶,也就是往下下一步或者两步,就是dp[i] = dp[i - 1] + dp[i - 2]
然后返回dp[n]
class Solution:def findUnsortedSubarray(self, nums: List[int]) -> int:n = len(nums)if n <= 1:return 0l, r = 0, n - 1while l < n - 1 and nums[l] <= nums[l + 1]:l += 1if l == n - 1:return 0while r > 0 and nums[r] >= nums[r - 1]:r -= 1min_val = min(nums[l:r+1])max_val = max(nums[l:r+1])while r < n - 1 and nums[r+1] < max_val:r += 1while l > 0 and nums[l-1] > min_val:l -= 1return r - l + 1
思路很简单,就是r和l先分别找出两端无序的地方,然后求中间的最大最小,进行左右扩圈
class Solution:def minWindow(self, s: str, t: str) -> str:cnt_s = Counter()cnt_t = Counter(t)ans_left, ans_right = -1, len(s)left = 0for right, e in enumerate(s):cnt_s[e] += 1while cnt_s >= cnt_t:if (right - left) < (ans_right - ans_left):ans_left, ans_right = left, rightcnt_s[s[left]] -= 1left += 1return "" if ans_left < 0 else s[ans_left: ans_right + 1]
关键点是用了 cnt_s = Counter() cnt_t = Counter(t),Counter
的比较是逐个字符的计数比较。然后利用滑动窗口的方法:
进入: cnt_s[e] += 1
更新:
if (right - left) < (ans_right - ans_left):
ans_left, ans_right = left, right
出去:
cnt_s[s[left]] -= 1
left += 1