【代码随想录刷题记录】977 有序数组的平方、209 长度最小的子数组 、59 螺旋矩阵II

977 有序数组的平方

  1. 题目
    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
    题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/
  2. 代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       int n = nums.size() - 1;
       vector<int> array(nums.size(),0);
        int left = 0, right = n;
        while(left <= right){
            if(nums[left] * nums[left] <= nums[right] * nums[right]){
                array[n--] = nums[right] * nums[right];
                right--;
            }
            else{
                array[n--] = nums[left] * nums[left];
                left++;
            }
        }
        return array;

    }
};
  1. 小结
    本题的解题方法有两种,一个是暴力法、一个是双指针法。暴力法即先将数组中的每个元素平方后再采用快排进行排序。由于数组总是从两边向中间递减,可以采用双指针比较两边的大小,将最大的写入新数组中,写入后指向该位置的指针向中间移动一位,再进行比较,重复以上操作,直到所有数组元素都写入新数组中。

209 长度最小的子数组

  1. 题目
    给定一个含有 n 个正整数的数组和一个正整数 target 。
    找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
    题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/
  2. 代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int Min = nums.size();//用于存放最小数组的长度
        long int sum = 0;//用于存放滑动窗口的和;
        int i = -1, temp = 0;
        for( int j = 0; j < nums.size();j++){
            sum += nums[j];
            while(sum >= target){
                temp = j-i;
                Min = min(Min,temp);
                i++;
                sum -= nums[i];
            }          
        }
        if(i == -1){//用于判断不存在的情况
            Min = 0;
        }
        return Min;
    }
};
  1. 小结
    暴力法即使用双循环,遍历整个数组,寻找以每个位置为起始位置的满足题目条件的子数组,并在遍历过程中不断记录更新最小子数组的长度。
    移动窗口法,使用i代表起始位置,j代表终止位置。若子数组的和不满足条件则 j 向前移动直到满足条件(此时 i不变,即只进行外层for循环,不参与内层while循环),若子数组的和满足条件,则 i 向前移动直到不满足条件(此时 j 不变,即参与内层while循环,不参与for循环。由于不参与for循环,故不能用if语句)

59 螺旋矩阵||

  1. 题目
    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
    题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
  2. 代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> Matrix(n, vector<int>(n, 0));
        int circle = 0;//表示循环次数;
        int count = 1;//用于计算填入数组的数字
        int i = 0, j = 0;
        while( circle < n/2  ){
            //左到右
            i = circle;  j = circle;
            for( j = circle; j < n-circle - 1 ; j++){
                 Matrix[i][j] = count++;
            }
            //上到下
            // i = circle, j = n-circle - 1;
            for( i = circle; i < n-circle - 1 ; i++){
                 Matrix[i][j] = count++;
            }
            //右到左
                //i = n - circle - 1, j =  n - circle - 1;
            for( j =  n - circle - 1; j > circle ; j--){
                Matrix[i][j] = count++;
            }
            //下到上
                //i = n - circle - 1, j = circle;
            for( i = n - circle - 1; i > circle ; i--){
                 Matrix[i][j] = count++;
            } 
            circle++;
        }
        if(n%2 != 0){
            Matrix[n/2][n/2] = count;
        }
        return Matrix;
    }
};
  1. 小结
    该题主要注意边界情况下各变量的取值以及边界条件的设定,同时还要注意 n 分别为奇偶数时最后一轮的处理情况。

你可能感兴趣的:(算法,leetcode)