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

    先说点废话,今天是真的精疲力尽,特别特别累,debug+装carla,明天就可以离职了,回学校安心的刷题了,天天白天上班晚上刷题真的顶不住,太累了。

    OKOK来到正题吧,第一道题目之前做的现在忘记了,看了一眼题解回想起来了,老规矩先把题目抄下来:

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
class Solution {
public:
    vector sortedSquares(vector& nums) {
       int k = nums.size() - 1;
       vectorresult (nums.size(),0);
       for (int 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.长度最小的子数组 

 

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

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组[4,3]是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

 

class Solution {
public:
    vector sortedSquares(vector& nums) {
       int k = nums.size() - 1;
       vectorresult (nums.size(),0);
       for (int 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;
    }
};

这道题我开始想用暴力解法,但是做不对,这里是抄的滑动窗口,不是特别清楚原理

59.螺旋矩阵II

 

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

代码随想录算法训练营day2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II_第1张图片

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]
class Solution {
    public:
        vector> generateMatrix(int n) {
            vector> ans(n, vector(n));
            int startX = 0, startY = 0, offset = 1, count = 1, i, j, loop = n / 2, mid = n / 2;
            while (loop--) 
            {
                for (j = startX; j < n - offset; j++) {
                    ans[startX][j] = count++;
                }
                for (i = startY; i < n - offset; i++) {
                    ans[i][j] = count++;
                }
                for (; j > startY; j--) {
                    ans[i][j] = count++;
                }
                for (; i > startX; i--) {
                    ans[i][j] = count++;
                }
                startX++;
                startY++;
                offset += 1;
            }
            if (n % 2 == 1)
            {
                ans[mid][mid] = count;
            }
            return ans;
        }
    };

 主要的思想还是一个边界思想,也就是循环不变量,保证一直都是左闭右开,然后一层层循环下来,如果n是奇数,那么则独自的给最中间的量赋值。

 

你可能感兴趣的:(leetcode,数据结构)