day002(代码随想录) 学习记录

977.有序数组的平方

感觉和昨天做的移出元素有些类似挺简单的,就不赘述啦(∩_∩)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int slow=0;
         for(int i=0;i<nums.size();i++){
             nums[slow++]=nums[i]*nums[i];
         }
         sort(nums.begin(),nums.end());
         return nums;
    }
};

209.长度最小子数组

首先用的是双层for循环的暴力做法,时间复杂度较高,但是容易想出来  O(n*n)。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
            int num=INT_MAX;
              for(int i=0;i<nums.size();i++){
                int result=0;
                for(int j=i;j<nums.size();j++){
                     result+=nums[j];
                     if(result>=target){
                         num=min(num,j-i+1);
                        break;
                     }
                }
            }
            return num==INT_MAX?0:num; 
    }
};

第二种方法,滑动窗口法,定义两个指针,来维护两指针内的数之和要大于等于目标值,统计两个指针的个数,返回最小的值。本题中最重要的点在于要懂得移动起始点的位置来找出所有情况。时间复杂度O(n)

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
             int sum=0;
             int result=INT_MAX;//
             int i=0;
             int subLenth=0;
             for(int j=0;j<nums.size();j++){
              sum+=nums[j];
              while(sum>=target){//为什么不能用if呢 是因为if只能循环一次,而用while是要搜索所有情况
                  subLenth=j-i+1;
                  result=min(result,subLenth);
                    sum-=nums[i++];//滑动窗口的精华所在 移动起始指针,并将其数从总和中移除
              }    
            }
            return result==INT_MAX?0:retult;//如果result没有变,代表不存在符合条件的子数组
    }
};

59.螺旋矩阵二

考察对代码的掌控能力的一道题,做过,但是忘记了(~_~;),捋一遍思路,首先题目要求是生成一个包含n^2的所有数,此时有两种情况,一种是n为奇数,只需要将最后中间的值赋值给二维数组就可,而偶数的话就无需操作即可,定义offset=1,即可以控制层数(当进入下一层时加一)也可以作为循环的左闭右开区间,循环条件是n/2!=0,在循环条件内,通过for去遍历复制(先是从左到右,再是从上到下,然后是从右到左,最后是从下至上) ,然后将起始位置x,y分别+1,代表进入下一层。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
         int startx=0;
         int starty=0;
         int offset=1;
         int count=1;
         int loop=n/2;
         int mid=n/2;
         vector<vector<int>> nums(n,vector<int>(n,0));
         int i,j;
         while(loop--){
             i=startx;
             j=starty;
             for(j;j<n-offset;j++){//从左到右
                  nums[i][j]=count++;
             }
             for(i;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+=1;//进入下一层 因为是内层所以要-1
           }
           if(n%2==1){//判断奇偶
               nums[mid][mid]=count;
           }  
         return nums;
    }
};

总结:今天学到了滑动窗口的两种解法,外加螺旋矩阵,虽然感觉螺旋矩阵不难,但是实际写的过程中,还是很容易落一些条件,需要注意一下。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值