day2-数组part02| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II

这篇具有很好参考价值的文章主要介绍了day2-数组part02| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

977. 有序数组的平方

思路

  • 数组平方后的最大值只可能在数组两端,不可能在中间
  • 设置双指针,比较两个指针所指值的大小,记录较大值,接着向中间移动这个指针
  • 结束条件:左右指针相背
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
    int k = nums.size() - 1;
        vector<int> result(nums.size(), 0);
        int i=0,j=nums.size()-1;
        while (i<=j) { // 注意这里要i <= j,因为最后要处理两个元素
            if (nums[i] * nums[i] < nums[j] * nums[j])  {
                result[k] = nums[j] * nums[j];
                k--;
                j--;
            }
            else {
                result[k] = nums[i] * nums[i];
                k--;
                i++;
            }
        }
        return result;
    
    }
};

209.长度最小的子数组

暴力一直不过,明天再补一下

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT32_MAX; //初始化子数组的最小长度为无穷大
        int sum=0;
        int length=0;
        for(int i=0;i<nums.size();i++){
            sum=0;
            for(int j=i;j<nums.size();j++){
                sum += nums[j];
                if(sum >= target){
                    length=j-i+1;
                    result=result<length?result:length;
                    break;
                }
            }
        }
        return result == INT32_MAX ? 0 : result;//如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
    }
};

滑动窗口

不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

思路

子数组的和小于目标值,移动j指针直到找到大于等于目标值的子数组
找到后,j指针不动,移动i指针,如果移动后的子数组和小于目标值,继续移动j指针,直到和大于等于目标值
重复这个2步骤,直到遍历结束

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT32_MAX;
        int sum=0;
        int i=0;
        int length=0;
        for(int j=0;j<nums.size();j++){
            sum +=nums[j];
            //满足大于等于目标值后,移动i
            while(sum>=target){
                length=j-i+1;
                result=min(result,length);
                sum=sum-nums[i];
                i++;
            }
        }
        return result==INT32_MAX?0:result;
    }
};

59. 螺旋矩阵 II

本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。

注意:循环不变量

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
       vector<vector<int>> res(n,vector<int>(n,0));
       int startx=0,starty=0;
       int mid=n/2;
       int count=1;
       int offset=1;
       int i,j;
       int loop=n/2;
       while(loop--){
           i=startx;
           j=starty;
           //第一行
           for(j=starty;j<n-offset;j++){
               res[startx][j]=count++;
           }
           //第n-1列
           for(i=startx;i<n-offset;i++){
               res[i][n-offset]=count++;
           }
           for(j=n-offset;j>starty;j--){
               res[n-offset][j]=count++;
           }
           for(i=n-offset;i>startx;i--){
               res[i][starty]=count++;
           }
        startx++;
        starty++;
        offset++;
       } 
       if(n%2){
           res[mid][mid]=count;
       }
       return res;
    }
};

心得

手写一下,把每个值带到带到代码里就明白了文章来源地址https://www.toymoban.com/news/detail-432560.html

到了这里,关于day2-数组part02| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包