73 - 77
73: 矩阵置零
我跟官方解竟然一样哎 难点在于原地 

class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
n = len(matrix[0])
fir0row = -1
fir0col = -1
#找到第一个0所在的行列
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
fir0row = i
fir0col = j
break
else:
continue
break
if fir0row == -1: #找不到就返回
return matrix
else:
for i in range(fir0row,m):
for j in range(n):
if matrix[i][j] == 0:
matrix[fir0row][j] = 0
matrix[i][fir0col] = 0 #遍历整个数组 用记录器记录
for j in range(n):
if j == fir0col:
continue
if matrix[fir0row][j] == 0: #如果参考行的某一列为0 那么 这一列全变成0
for i in range(m):
matrix[i][j] = 0
for i in range(m):
if i == fir0row:
continue
if matrix[i][fir0col] == 0: #如果参考列的某一行为0 那么 这一行全变成0
for j in range(n):
matrix[i][j] = 0
for i in range(m): #变记录器所在行列
matrix[i][fir0col] = 0
for j in range(n):
matrix[fir0row][j] = 0
return matrix
作者:yizhu-jia
链接:https://leetcode-cn.com/problems/set-matrix-zeroes/solution/yuan-di-suan-fa-chang-shu-kong-jian-yong-nhoz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
74 : 搜索二维矩阵
为什么会有这么多人击败我 为什么?? 我知道额 因为我只用了一次二分法
没想到要用两个 二分法
class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: row = -1 m = len(matrix) n = len(matrix[0]) if target > matrix[m-1][n-1] or target < matrix[0][0]: return False for i in range(m): if target <= matrix[i][n-1]: row = i break left = 0 right = n-1 while left <= right: mid = (left+right)//2 if matrix[row][mid]== target: return True elif matrix[row][mid] > target: right = mid - 1 else: left = mid + 1 return False 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/search-a-2d-matrix/solution/wei-shi-yao-hui-you-zhe-yao-duo-ren-ji-b-ke9n/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
75“: 颜色分类 快排的思路
將數組劃分爲三段,
ord0之前全是0
ord0到ord2后全是未排序的
ord2之后全是2
遍历时 遇到0就和ord0的交换
遇到2就和ord2的交换
注意遍历位置的移动。
class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ pos = 0 ord0 = 0 n = len(nums) ord2 = n-1 while pos <= ord2: if nums[pos] == 0: nums[ord0],nums[pos] = nums[pos],nums[ord0] ord0 += 1 pos += 1 elif nums[pos] == 1: pos += 1 else: nums[ord2],nums[pos] = nums[pos],nums[ord2] ord2 -= 1 return nums 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/sort-colors/solution/kuai-pai-de-si-xiang-by-yizhu-jia-mcop/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
76:
最小覆盖子串
就是滑动窗口 遍历就不说了 就是遇到一个字典加一个
重要的是遇到一个满足条件的子串后怎么办!!! 满足条件就是包含t中所有的
我做了两步
1:收缩左边界 直到不满足条件 这样左窗口会多滑一格 它左边的一位也是我们要的
2: 比较现窗口和最小窗口的长度 注意长度是R-L+2 因为上面少了一位 如果小 结果改为现在的窗口
class Solution: def minWindow(self, s: str, t: str) -> str: def check(dict1,dict2): for each in dict1: if dict1[each] < dict2[each]: return False return True tdict = {} left = 0 right = 0 ns = len(s) sdict = {} rel ="" minlen = ns+1 for each in t: if each not in tdict: tdict[each] = 1 sdict[each] = 0 else: tdict[each] += 1 while right< ns: if s[right] in sdict: sdict[s[right]] += 1 if check(sdict , tdict): while check(sdict,tdict): if s[left] in sdict: sdict[s[left]] -= 1 left += 1 if left == ns: return s[-1] if right-left+2 < minlen: minlen = right-left+2 rel = s[left-1:right+1] while s[left] not in sdict: left += 1 if left == ns: return rel right += 1 return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/hao-ba-zhi-shao-shi-xie-dui-liao-zi-wo-g-bxqu/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
77 组合
普通·的回溯 普通的一天
每次回溯传入的是当前层可以加入的最小的数 保证递增的结果
只回溯了n-k+2 作为开头的那些 后面的长度不够
class Solution: def combine(self, n: int, k: int) -> List[List[int]]: rel = [] currel = [] def dfs(s): if len(currel) == k: rel.append(currel[:]) for i in range(s,n+1): currel.append(i) dfs(i+1) currel.pop() for i in range(1,n-k+2): currel.append(i) dfs(i+1) currel.pop() return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/combinations/solution/pu-tong-de-hui-su-pu-tong-de-yi-tian-by-w1az4/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号