代码随想录算法训练营Day 02| 数组part02| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

代码随想录算法训练营Day 02| 数组part02| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II



907.有序数组的平方

题目链接

一、规矩的双指针

class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        l = 0           #左指针
        r = len(nums)-1 #右指针
        k = len(nums)-1 #新列表的更新指针
        res = [0]*len(nums) #存放结果的列表(一定要新建立一个列表)
        while(l<=r):        #注意这里要i <= j,因为最后i=j的元素也要放在新数组里
            if nums[l]**2>nums[r]**2:
                res[k] = nums[l]**2
                k -=1
                l +=1
            else:
                res[k] = nums[r]**2
                k -=1
                r -= 1
        return res

注意本题的特性是由左右往中间减小,所以双指针指向头尾。循环的条件是i<=j,等号不能省略,且不能将更新放在原数组。

二、美好的暴力解法

class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        #暴力
        return sorted(x*x for x in nums)

三、本题总结

这道题第一眼看不会,看了一遍视频后,双指针的方法印象很深刻了。之前写了两次都忘记重新定义新的结果存放数组,希望以后不要再犯一样的错误了。


209.长度最小的子数组

题目链接

一、滑动窗口初见

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        sum = 0
        minlen = float('inf')
        for j in range(len(nums)):
            sum += nums[j]
            while(sum>=target):
            	minlen = min(minlen, j-i+1) #先更新长度
                sum -= nums[i]    
                i += 1
        return 0 if minlen==float('inf') else minlen

这是第一次接触滑动窗口的题目,方针就是大了左指针右移,小了右指针右移,然后在每次满足target条件后更新长度,再移动左指针。

二、怎么写都超时的暴力解法

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        #暴力解法
        minlen = float('inf')
        for i in range(len(nums)):
            sum = 0
            for j in range(i,len(nums)):
                sum +=nums[j]
                if sum>=target:
                    minlen = min(minlen,j-i+1)
                    break #加break都超时
        return 0 if minlen==float('inf') else minlen

三、本题总结

老老实实写滑动窗口吧!


59.螺旋矩阵II

题目链接

一、不涉及算法 纯写

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        matrix = [[0]*n for _ in range(n)]
        loop = n/2          #圈数
        startx,starty = 0,0 #每圈的起点 
        bias = 1
        count = 1
        while loop:
            # 每一圈从(startx,starty)开始,每一条边都是左闭右开,需要考虑每条边的起始点表达
            for i in range(starty,n-bias):
                matrix[startx][i] = count
                count +=1
            for j in range(startx,n-bias):
                matrix[j][n-bias] = count
                count +=1
            for i in range(n-bias,starty,-1):
                matrix[n-bias][i] =count
                count +=1
            for j in range(n-bias,startx,-1):
                matrix[j][startx] = count
                count +=1
            loop -=1
            startx +=1
            starty +=1
            bias +=1
        #加n为奇数的判断
        if n%2 ==1:
            matrix[n/2][n/2]=n*n

        return matrix
        

这个题目主要是搞清楚边界条件,都用左闭右开的形式,这样就可以保证每条边不会重叠,然后看内部的for循环其实就是几个边界点的排列组合,还算是比较简单的。

二、本题总结

有空把剩下几道螺旋矩阵也给做做吧!你这代码能力,哎!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值