2022跟着leedcode学数据结构--第6天

131 阅读1分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

image.png

[螺旋矩阵 II]

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

  示例 1:

image.png

输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1 输出:[[1]]  

提示:

1 <= n <= 20

解题思路: 1.找规律题 2.同样的方法先判断特殊情况 n==1 return [[1]] 3.先生成一个表res 代表当前的四方格,然后进行填充需要的值 4.一步一步来,每次一圈进行数据处理,处理到最后生成的res就是我们想要的结果了

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        if n==1:
            return [[1]]
        res = [[0 for i in range(n)] for i in range(n)]
        index = 1
        cricle = 0
        while index  <= n*n:
            for i in range(0+cricle,n-cricle):
                res[0+cricle][i] = index
                index += 1
            for j in range(1+cricle,n-cricle):
                res[j][n-1-cricle] = index
                index += 1
            for i in reversed(range(0+cricle,n-1-cricle)):
                res[n-1-cricle][i] = index
                index += 1
            for j in reversed(range(1+cricle,n-1-cricle)):
                res[j][0+cricle] = index
                index += 1
            cricle += 1


        return res


执行结果:

image.png

[搜索二维矩阵 II]

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。 每列的元素从上到下升序排列。  

示例 1:

image.png

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 输出:true 示例 2:

image.png

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20 输出:false  

提示:

m == matrix.length n == matrix[i].length 1 <= n, m <= 300 -109 <= matrix[i][j] <= 109 每行的所有元素从左到右升序排列 每列的所有元素从上到下升序排列 -109 <= target <= 109

解题思路: 1.对矩阵做遍历,在每一行中查找是否符合条件的数据 2.通过二分法进行提高效率查找。

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        def two_dichotomy(i):
            l, n = 0, len(matrix[0])-1
            while l <= n:
                m = (l+n)//2
                if matrix[i][m] > target:
                    n = m - 1
                elif matrix[i][m] < target:
                    l = m + 1
                else:
                    break              
            if matrix[i][m] == target:
                return True  

        for i in range(len(matrix)):
            if two_dichotomy(i):
                return True
        return False
        

执行结果:

image.png