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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2021-11-01 16:51  yi术家  阅读(37)  评论(0)    收藏  举报