2021-10-31每日打卡:腾讯精选50题

2021-10-31每日打卡:每日打卡:腾讯精选50题

写在前面

“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,遵循LeetBook 列表/腾讯的刷题顺序,所有代码已通过。每日3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。

54.螺旋矩阵

在这里插入图片描述

  • 移动边界法:注意while并不能检查到每个for循环,可能存在后面两个循环已经无需进行(上面两个循环导致的边界已经超过范围拉),所以还要加个if判断
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        # 上下左右         
        s,x,z,y = 0,len(matrix)-1, 0, len(matrix[0])-1
        res = []
        # 相等的情况也需要完成该遍遍历
        while s<=x and z<=y:
        	# 注意range的最后一个取不到
            for col in range(z,y+1):
                res.append(matrix[s][col])
            s+=1
            if s>x: break
            for row in range(s,x+1):
                res.append(matrix[row][y])
            y-=1
            if y<z: break
            for col in range(y,z-1,-1):
                res.append(matrix[x][col])
            x-=1
            for row in range(x,s-1,-1):
                res.append(matrix[row][z])
            z+=1
        return res
                     

673. 螺旋矩阵II

在这里插入图片描述

  • 移动边界:
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # 上下左右         
        s,x,z,y = 0,n-1, 0, n-1
        # 注意初始化结果的方法
        res, num = [[None]*n for _ in range(s,x+1)], 1
        while s<=x and z<=y:
            for col in range(z,y+1):
                res[s][col]= num
                num+=1
            s+=1
            if s>x: break
            for row in range(s,x+1):
                res[row][y]=num
                num+=1
            y-=1
            if y<z: break
            for col in range(y,z-1,-1):
                res[x][col]=num
                num+=1
            x-=1
            for row in range(x,s-1,-1):
                res[row][z]=num
                num+=1
            z+=1
        return res            
            

88. 合并两个有序数组

在这里插入图片描述

  • 第一想法是“合并+排序”,然后想到可以“双指针比较-插入”,而为了前面元素不被覆盖,采取倒序转移:
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        p1, p2, index = m-1, n-1, m+n-1
        while (p1>=0 and p2>=0):
            if nums1[p1]>nums2[p2]:
                nums1[index]=nums1[p1]
                p1-=1
            else: 
                nums1[index]=nums2[p2]
                p2-=1
            index-=1
        while p2>=0:
            nums1[index]= nums2[p2]
            index-=1
            p2-=1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值