day2 双指针 滑动窗口 螺旋矩阵2

文章介绍了使用双指针解决编程问题的两个示例:一是有序数组的平方,通过双指针技巧避免了多余的计算;二是找到长度最小的子数组,利用滑动窗口的概念优化了暴力求解的复杂度。此外,还讨论了构建螺旋矩阵的算法,强调了循环不变量和边界条件的重要性。
摘要由CSDN通过智能技术生成

977 有序数组的平方
用到了双指针,
注意i == j的时候,对应的元素是同一个,不能漏掉
这个题目是第二次做,还是比较熟悉的

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //要熟悉vector定义的方法
        //定义一个列为num.size()的长度,行为0的数组
        vector<int> result(nums.size(), 0);
        //i从最左边,j从最右边,k是指示下标
        int i, j, k = nums.size() - 1;
        for(i = 0, j = nums.size() - 1; i <= j; ) {
            if(nums[i] * nums[i] <= nums[j] * nums[j]) {
                result[k--] = nums[j] * nums[j];
                j--;
            }
            else {
                result[k--] = nums[i] * nums[i];
                i++;
            }
        }
        return result;
    }
};

209 长度最小的子数组
这个题目的循环形式,判断条件,循环内容,还是有点刁钻的,不容易想到
滑动窗口,相当于也是双指针
此类题目第一次做,看视频勉强看懂了,但是自己写还是有问题,技巧性很强

//暴力解法,两个for循环,所有可能都遍历出来,找到大于等于s的,再选出长度最小的
//滑动窗口,双指针的思想,取两个指针中间的集合,所以更像是一个窗口
//就是用一个for循环,做两个for循环所做的事情
//j如果表示起始位置,那么终止位置依然要全部遍历,和暴力解法类似
//j应该指向终止位置
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int subL = 0;
        int result = INT32_MAX;
        int sum = 0, i = 0;
        for(int j = 0; j < nums.size(); j++) {//终止位置向后移动
            sum += nums[j];//收集元素的和

            while(sum >= target) {//i持续向后移动的过程,用while,判断的是上一轮的结果
            
                subL = j - i + 1;//记录每一个符合条件的subL
                
                result = min(result, subL);//记录一个结果,因为有while的判断在,这个结果一定是符合的

                sum = sum - nums[i];//默认i向后开始移动一个,直接做操作,结果放在while里判断

                i++;

                //逐个向后面移动i,在while循环中可以做多次
                //大概意思是,j向后的过程中,可能遇到比较大的值
                //只要sun还是大于s的,就可以i尝试向前移,有可能可以节省下一些距离
                //一旦sum小于s了,j又开始尝试向后移
                //是一个反复拉扯的过程,尽量使得j不要后移,尽量使得i前移,这样缩小窗口长度
            }
        }
       return result == INT32_MAX ? 0 : result;
    }
};

59 螺旋矩阵 II
这个题目第二次做了 思路很简单其实 看似复杂
循环不变量
边界条件,左闭右开
分类四个方向分别进行处理
边界细节可以用具体参数代入手写模拟
对于vector二维数组的定义不太熟练

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> nums(n, vector<int>(n, 0));//初始化定义二维数组的方法
        int startx = 0, starty = 0, i, j;
        int offset = 1;
        int count = 1;
        int loop = n/2;
        while(loop--) {//n是偶数,转n/2圈。n是奇数,转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; j > starty; j--) {
                nums[i][j] = count++;
            }
            //纵向从下向上
            for (i; i > startx; i--) {
                nums[i][j] = count++;
            }
            
            offset++;
            startx++;
            starty++;
            //loop--;

        }
        if(n % 2 == 1) {
            nums[n/2][n/2] = n*n;
        }
        return nums;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值