Day2 数组:977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ

 数组总结

数组要降时间复杂度就要把双重循环改为双指针,至于双指针的起始位置就看题目的特性,可以两边都试试

 977.有序数组的平方 

题目建议: 本题关键在于理解双指针思想 

题目链接:. - 力扣(LeetCode)

思考:同时处理两件事,并且某一件事为从头到尾,另一件为执行一部分数据时,用双下标法 (通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

 易错点:result[::-1]代表倒序;空数组添加新元素是用result.append(nums[i]*nums[i])

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        i,j=0,0
        while i<len(nums):
            j=0
            nums[i]=nums[i]*nums[i]
            while j<i:
                if nums[i]<nums[j]:
                    a= nums[i]
                    nums[i]=nums[j]
                    nums[j]=a
                j+=1
            i+=1
        return nums
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        i,j=0,len(nums)-1
        result=[]
        r=len(nums)-1
        while i<j:
            if(nums[i]*nums[i]<nums[j]*nums[j]):
                result.append(nums[j]*nums[j])
                j-=1
            else:
                result.append(nums[i]*nums[i])
                i+=1
        result.append(nums[i]*nums[i])   
        return result[::-1]
 209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口

题目链接:. - 力扣(LeetCode)

python3中数组切片为:

双重循环会超时

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        i,j=0,0
        result=[]
        while(i<len(nums)):
            j=i
            while(sum(nums[i:j])<7 and j<i<len(nums)):
                j+=1
            if(len(result)>len(nums[i:j])):
                result=nums[i:j]
        if(len(result==0)):
            return 0
        else:
            return len(result)
        

思考:通过双下标构成滑动窗口 ,时间复杂度为o(n),因为j遍历一遍n,i遍历的总次数是n,所以是2n,复杂度则为o(n)

易错点:j要在最后加,仍未思考很明白

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        i,j=0,0
        result=0
        sumup=0
        while j<len(nums):
                    sumup+=nums[j]
                    while sumup>=target and i<len(nums):
                        if result>0:
                            if j-i<result:
                                result=j-i+1
                        else:
                            result=j-i+1
                        sumup-=nums[i]
                        i+=1
                        print("i",nums[i:j+1])
                    j+=1
                    



        if result==0 :
            return 0
        else:
            return result
        

59. 螺旋矩阵 II 

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

题目思考: result=[[0 for i in range(n)] for j in range(n) ]//二维数组生成器 固定写法要记住

        四个循环写完四种情况 

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        startx=0
        starty=0
        result=[[0 for i in range(n)] for j in range(n) ]//二维数组生成器 固定写法要记住
        a=1
        side=n
        for i in range(n//2)://四个循环写完四种情况
            while starty<(side-1-i):
                result[startx][starty]=a
                a+=1
                starty+=1
            while startx<(side-1-i):
                result[startx][starty]=a
                a+=1
                startx+=1
            while starty>i:
                result[startx][starty]=a
                a+=1
                starty-=1
            while startx>i:
                result[startx][starty]=a
                a+=1
                startx-=1    
            # side-=1
            startx+=1                
            starty+=1
        if n%2==1:
            result[startx][starty]=a
        return result    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值