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

977.有序数组的平方

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
    vector<int> r(nums.size(),0);
    int k=nums.size()-1;
     for(int i=0,j=nums.size()-1;i<=j;)
     {
        if(nums[i]*nums[i]<nums[j]*nums[j])
        {
           r[k--]=nums[j]*nums[j];
           j--;
        }
         else
         {
             r[k--]=nums[i]*nums[i];
             i++;
         }




     }

return r;
    }
};

其实这道题目主要想的还是双指针,为么能从i=0和j=nums.size()-1开始比较,主要还是因为数组本身的排序就是从小到大的(出现了负数),所以我们比较只需要比较头和尾就行了,因为平方之后中间是最小的,因为要求是从小到大,所以我们就要比较哪个大 哪个大我们就放进nums[k--],注意这时候是k--

209.长度最小的子数组

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

文章讲解:代码随想录

视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; 
        int i = 0; 
        int subLength = 0;
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
           
                     while(sum>=target)
                     {
                        subLength=j-i+1;
                        if(subLength<result)
                        result=subLength;
                         sum-=nums[i++];

                     }


               
                
            }
        

       if(result ==INT32_MAX)
       {
        return 0;
       }
       else
       {
        return result;
       }

    }
};

其实这道题的话难度主要是理解滑动窗口,这个题目要求的子数组就是要求连续的,这个时候我们可以定义两个指针,一个是窗口的头一个是窗口的尾巴,这个时候头往前动一次就将nums[j]加入sum里面,直到sum>target的时候,计算窗口的大小如果小于原先的值那么替代,然后将sum减去窗尾的值  注意这个时候不能是if因为是if的话那么就只执行一次减去窗尾的值,因为减去窗尾之后sum不一定就小于target了,所以需要while循环判断

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
     vector<vector<int>> jz(n, vector<int>(n, 0));
     int startx=0;
     int starty=0;
     int loop=n/2;
     int cor=1;
     int mid =n/2;
     int i,j;
     int offset=1;
     while(loop--)
     {
         i = startx;
            j = starty;

            
            for (j; j < n - offset; j++) {
                jz[i][j] = cor++;
            }
            
            for (i; i < n - offset; i++) {
                jz[i][j] = cor++;
            }
            
            for (; j > starty; j--) {
                jz[i][j] = cor++;
            }
            
            for (; i > startx; i--) {
                jz[i][j] = cor++;
            }

          
            startx++;
            starty++;

            
            offset += 1;
                  
            
     }
     

 if (n % 2) {
            jz[mid][mid] = cor;
        }
        return jz;



    }
};

其实这个题目还是很细的,因为要考虑到圈数以及最中间的值还有转第下圈时,赋值的边界也要改动,以及初始的赋值位置,其实还是一样需要拿纸和笔模拟一下二维数组的变化过程会好懂很多。

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值