LeetCode算法笔记Day04

48、旋转图像(思路是将矩阵左上、右上、左下、右下的点旋转)但是不太理解的是为什么内层的j到n+1//2

class Solution:

    def rotate(self, matrix: List[List[int]]) -> None:

        n=len(matrix)

        for i in range(n//2):

            for j in range((n+1)//2):

                temp=matrix[i][j]

                matrix[i][j]=matrix[n-1-j][i]

                matrix[n-1-j][i]=matrix[n-1-i][n-1-j]

                matrix[n-1-i][n-1-j]=matrix[j][n-1-i]

                matrix[j][n-1-i]=temp

54、旋转矩阵 (用left,right,up,down确定遍历的边界)

class Solution:

    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:

        m=len(matrix)

        n=len(matrix[0])

        lis=[]

        left,right,up,down=0,n-1,0,m-1

        while 1:

            if left>right:

                break

            for idx in range(left,right+1):

                lis.append(matrix[up][idx])

            up+=1

            if up>down:

                break

            for idx in range(up,down+1):

                lis.append(matrix[idx][right])

            right-=1

            if left>right:

                break

            for idx in range(right,left-1,-1):

                lis.append(matrix[down][idx])

            down-=1

            if up>down:

                break

            for idx in range(down,up-1,-1):

                lis.append(matrix[idx][left])

            left+=1

        return lis

498、对角线遍历(一开始想是像上面一题,然后发现只要只要移动行和列就可以斜向上遍历或斜向下遍历)需要注意每一次到边界后row,col的值如何改变

class Solution:

    def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:

        m=len(mat)

        n=len(mat[0])

        ele=[]

        row=0

        col=0

        ele.append(mat[row][col])

        while (row!=m-1 or col!=n-1):

            while 1:

                if row==m-1 and col==n-1:

                    break

                if row==0 or col==n-1:#如果到达边界

                    if col< n-1:

                        col+=1

                        ele.append(mat[row][col])

                        break

                    else :

                        row+=1

                        ele.append(mat[row][col])

                        break

                row-=1

                col+=1

                ele.append(mat[row][col])

            while 1:

                if row==m-1 and col==n-1:

                    break

                if col==0 or row==m-1:

                    if row<m-1 :

                        row+=1

                        ele.append(mat[row][col])

                        break

                    else:

                        col+=1

                        ele.append(mat[row][col])

                        break

                row+=1

                col-=1

                ele.append(mat[row][col])

        return ele

238、除自身的乘数(分别求左侧和右侧的乘积)O(n)

class Solution:

    def productExceptSelf(self, nums: List[int]) -> List[int]:

        left,right,ans=[1]*len(nums),[1]*len(nums),[1]*len(nums)

        for i in range(1,len(nums)):

            left[i]=left[i-1]*nums[i-1]

        for i in range (len(nums)-2,-1,-1):

            right[i]=right[i+1]*nums[i+1]

        for i in range(len(nums)):

            ans[i]=left[i]*right[i]

        return ans

空间优化O(1),不引入left right列表,而是直接用两个for循环分别在ans上操作,详见解析,链接如下:238. 除自身以外数组的乘积 - 力扣(LeetCode) 

73、矩阵置零(方法一是直接使用一个同样大小的矩阵记录0,二是用第一行和第一列记录该行\列中是否有0,加上对第一行第一列是否有零的标记)

方法二:

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])

        flagcol=any(matrix[i][0]==0 for i in range(m))

        flagrow=any(matrix[0][j]==0 for j in range(n))

        for i in range(1,m):

            for j in range(1,n):

                if matrix[i][j]==0:

                    matrix[i][0]=matrix[0][j]=0

        for i in range(1,m):

            for j in range(1,n):

                if matrix[i][0]==0 or matrix[0][j]==0:

                    matrix[i][j]=0

        if flagcol:

            for i in range(m):

                matrix[i][0]=0

        if flagrow:

            for j in range(n):

                matrix[0][j]=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值