代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

  • 错误的vector遍历方式,这会导致访问越界!!!while(nums[flag]<0)flag++;

倒也不难,我的思路是先找到分界点然后向两头前进,用归并排序的思想解题。
下面是我的答案:

点击查看代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int flag = 0;
        while ((nums[flag] < 0) && (flag + 1 < nums.size()))
            flag++;
        if (flag >= nums.size())
            flag = nums.size() - 1;
        for (int i = 0; i < nums.size(); i++) {
            nums[i] = nums[i] * nums[i];
        }
        int j, k;
        j = 1, k = 1;
        vector<int> temp;
        if (flag != 0)
            if (nums[flag] > nums[flag - 1])
                flag--;
        temp.insert(temp.end(), nums[flag]);
        while ((flag - j >= 0) && (flag + k < nums.size())) {
            if (nums[flag - j] < nums[flag + k]) {
                temp.insert(temp.end(), nums[flag - j]);
                j++;
            } else {
                temp.insert(temp.end(), nums[flag + k]);
                k++;
            }
        }

        if (flag - j < 0)
            for (int i = flag + k; i < nums.size(); i++) {
                temp.insert(temp.end(), nums[i]);
            }
        else
            for (int i = flag - j; i >= 0; i--) {
                temp.insert(temp.end(), nums[i]);
            }

        return temp;
    }
};

我的答案pro版:

点击查看代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        int negative = -1;
        for (int i = 0; i < n; ++i) {
            if (nums[i] < 0) {
                negative = i;
            } else {
                break;
            }
        }

        vector<int> ans;
        int i = negative, j = negative + 1;
        while (i >= 0 || j < n) {
            if (i < 0) {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
            else if (j == n) {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else if (nums[i] * nums[i] < nums[j] * nums[j]) {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
        }

        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更优化的双指针,从首尾开始:
点击查看代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n);
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                ++i;
            }
            else {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
记录一下思路:首先窗口不断滑动,先动尾部,当超出target时移动首部直到不超出target,继续移动尾部。同时记录结果最小值。

点击查看代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int count=0;
        int start=0;
        int num=-1;
        for(int i=0;i<nums.size();i++){
        count+=nums[i];
        if(count>=target){           
        do{        
            if((num>i-start)||(num<0))num=i-start+1;

            count-=nums[start];
            start++;
        }while(count>=target);

        }
        }

        if(num>0)return num;
        return 0;
    }
};

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
image
本题投降
可用模拟的思想,模拟矩阵的生成,跑一段直线到头削掉一层,这样的思路最清晰简洁了。

点击查看代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int k=1;
        int top=0;
        int buttom=n-1;
        int left=0;
        int right=n-1;
    vector<vector<int>>Max(n,vector<int>(n));
    while(k<=n*n){
        for(int i=left;i<=right;i++,k++) Max[top][i]=k;
        top++;
        for(int i=top;i<=buttom;i++,k++) Max[i][right]=k;
        right--;
        for(int i=right;i>=left;i--,k++)Max[buttom][i]=k;
        buttom--;
        for(int i=buttom;i>=top;i--,k++)Max[i][left]=k;
        left++;
    }
    return Max;
    }
};
posted @ 2024-01-25 20:38  SandaiYoung  阅读(4)  评论(0编辑  收藏  举报