代码随想录算法训练营第二天 |

977. 有序数组的平方
双指针,首尾指针,因为数组有序且有负数,所以数组的平方值在收尾两边之一取最大,然后其中一个指针向对应的方向移动即可。

    vector<int> sortedSquares(vector<int>& nums) {

        vector<int> res(nums.size(),0);
        for(int l=0,r=nums.size()-1,pos=nums.size()-1;l<=r;)
        {
            if(nums[l]*nums[l]>nums[r]*nums[r])
            {
                res[pos] = nums[l]*nums[l];
                ++l;
            }
            else
            {
                res[pos] = nums[r]*nums[r];
                --r;
            }
            --pos;
        }
       
        return res;


    }

滑动窗口

滑动窗口法因为只遍历一遍数组所以一般情况下复杂度为 O (N)。
需要注意的点:
1.本类问题的代码关键是根据题目得出窗口收缩的时机,以及想清楚窗口收缩后应该干什么,用while还是if
2.窗口的增大一般是用for循环来向后走
3.同时也要考虑需不需要其他数据结构辅助保存一些需要的数据

int slidingwindow(int K,  vector<int>& arr) {
    vector<double> result(arr.size() - K + 1);
    int left= 0;
    for (int right= 0; right< arr.size(); right++) {
      
      if ()//关键在于窗口收缩的时机,判断逻辑while或者if
       {
       left++;//窗口收缩一般是指窗口头部向前移动,此时要更新与窗口头部相关的数据结构如map等
       }
    }
    return result;
  }

例如 209. 长度最小的子数组

  int minSubArrayLen(int target, vector<int>& nums) {
        int left=0,right=0;
        int minlen=INT_MAX;
        int sum=0;
        for(right=0 ;right<nums.size();++right)
        {
            sum+=nums[right];

            while(sum >= target)
            {
                    minlen=min(minlen,right-left+1);
                    sum-=nums[left];
                    ++left;
            }
        }
        return minlen == INT_MAX ? 0:minlen;


    }

模拟类题目

59. 螺旋矩阵 II
笔试很多模拟类题目比较考验功底

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值