刷题20240111

本文介绍了如何使用双指针技巧解决三个编程问题:有序数组的平方计算、长度最小的子数组查找以及螺旋矩阵生成。通过双指针控制范围并进行比较操作,优化了时间复杂度。
摘要由CSDN通过智能技术生成

977.有序数组的平方

之前刷过1-2遍,本题要求时间复杂度,所以不能暴力解法(暴力无意义

考察双指针,创建一个新的vector,双指针指向首尾,谁的平方大谁进新vector,然后往对方方向移动,直到两个指针相遇(相遇时也要判断,这是最后一个元素)

std::reverse函数的时间复杂度也为O(N)

总而言之,属于双指针里比较好想的

209.长度最小的子数组

以前也做过,一开始想成了动态规划,后来想起来这是为数不多的滑动窗口qwq

变相双指针的题目,两个指针作为一个窗口,右移时加上新进窗口的值,左移时减去离开窗口的值,再引入一个结果判断当前窗口大小即可,一遍AC

59.螺旋矩阵

这题倒是第一次做,之前看到过,一直没刷,太绕了,做起来确实很绕,是一个很需要细心判断初始条件和退出循环的题目,绕晕啦。

外层大循环判断循环次数,内层四个小循环依次修改最上边、最下边、最左边、最右边对应行列的元素,保证每次循环变量不变(代码逻辑要对),类似一种遍历,这个题估计以后还得重做加深加深印象。

ps:和答案的代码大致逻辑一致

相关代码:

977.有序数组的平方

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        vector<int> newnums;
        while (left <= right) {
            if (nums[right] * nums[right] > nums[left] * nums[left]) {
                newnums.push_back(nums[right] * nums[right]);
                right--;
            }
            else {
                newnums.push_back(nums[left] * nums[left]);
                left++;
            }
        }
        reverse(newnums.begin(),newnums.end());
        return newnums;
    }
};

209.长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0;
        int right = 0;
        int result = INT_MAX;
        int tempSum = 0;
        while (left <= right) { 
            if (tempSum < target) {
                if (right == nums.size()) break;
                tempSum += nums[right++];
            }
            else {
                if (right - left < result) result = right - left;
                tempSum -= nums[left++];
            }
        }
        return result == INT_MAX ? 0 : result;
    }
};

59.螺旋矩阵

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int point = 1;
        vector<vector <int>> result(n, vector<int>(n,0));
        for (int i = 0; i < n / 2 + 1; i++) {
            // 一共循环n/2次
            for (int j = i; j < n - i; j++) {
                result[i][j] = point++;
            }
            for (int j = i + 1; j < n - i; j++) {
                result[j][n - i - 1] = point++;
            }
            for (int j = n - i - 2; j >= i; j--) {
                result[n - i - 1][j] = point++;
            }
            for (int j = n - i - 2; j > i; j--) {
                result[j][i] = point++;
            }
        }
        return result;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值