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

977.有序数组的平方

初始想法:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        new_nums=[]
        for i in range(len(nums)):
            new_nums.append(nums[i]**2)
        new_nums.sort()
        return new_nums
#可AC

双指针思想

#伪代码
最大元素一定是在两边,存在负数
步骤
#定义一个新的数组来装元素
vector<int> result
k=numsize-1

for(i=0,j=numsize-1;i<=j#这里要有等号;  ){
if(nums[i]^2>nums[j]^2)
    result[k]=nums[i]^2
    k--;
    i++;
else{
   result[k]=nums[j]^2}
   k--;
   j--;
}
return result;
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        #双指针法
        #new_nums这里不能用new_nums=nums来定义,不然在new_nums内元素进行平方的时候,nums内的元素也在进行平方操作
        new_nums=[0 for _ in range(len(nums))]
        k=len(nums)-1
        i=0
        j=len(nums)-1
        while(i<=j):
            if(nums[i]**2<nums[j]**2):
                new_nums[k]=nums[j]**2
                k=k-1
                j=j-1
            else:
                new_nums[k]=nums[i]**2
                k=k-1
                i=i+1
        return new_nums

需要特别注意的是,#new_nums这里不能用new_nums=nums来定义,不然在new_nums内元素进行平方的时候,nums内的元素也在进行平方操作

209.长度最小的子数组

#伪代码
滑动窗口  双指针
暴力解法  两层for循环
滑动窗口是用一个for循环来做两层for循环做的事情
j#这里的j表示终止位置,起始位置如何确定 是关键问题
i=0#i是起始位置
result=max
for(j=0;j<=numsize;j++){
sum+=nums[j];
while(sum>=s){
  subl=j-i+1;
  result=min(result,subl)
  sum=sum-nums[i];
  i++;}
}
return result;
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        #滑动窗口,终止位置不断往后,起始位置如何移动是关键
        j,sum=0,0
        result=float("inf")
        for i in range(len(nums)):
            sum=sum+nums[i]
            while(sum>=target):
                length=i-j+1
                result=min(result,length)
                sum=sum-nums[j]
                j=j+1
        return 0 if result==float("inf") else result

59.螺旋矩阵II

#伪代码
转几圈  n/2
startx=0,starty=0
offset=1
count=1
while(n/2){
for(j=starty;j<n-offset;j++)
  nums[startx][j]=count++;
#下一条边
for(i=startx;i<n-offset;i++)
  nums[i][j]=count++;
for(;j>starty;j--)
  nums[i][j]=count++;
for(;i>startx;i--)
  nums[i][j]=count++
startx++;
starty++
offset++;
}
if(n%2==1):
 nums[i][j]=count;
#每条边的处理规则要统一
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        startx=0
        starty=0
        i=0
        count=1
        nums=[[0]*n for _ in range(n)]
        for offset in range(1,n//2 + 1):
            for j in range(starty,n-offset):
                nums[startx][j]=count
                count=count+1
            for i in range(startx,n-offset):
                nums[i][n-offset]=count
                count+=1
            for j in range(n-offset,starty,-1):
                nums[n-offset][j]=count
                count+=1
            for i in range(n-offset,startx,-1):
                nums[i][startx]=count
                count+=1
            startx+=1
            starty+=1
        if(n%2==1):
            nums[n//2][n//2]=count
        return nums

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值