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

有序数组的平方:

题目链接:有序数组的平方

思路:

由于数组两端为最大值可能出现的位置

比较原数组左右端点,取绝对值大者的平方后填入新数组。

class Solution {
public:
    vector sortedSquares(vector& nums) {
        int len =  nums.size();
        std::vector arr(nums);
        int left = 0;
        int right = len-1;
        for(int i = 0;iabs(arr[right]))?std::pow(arr[left++],2):std::pow(arr[right--],2);
        }
        return nums;
    }
};

长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

滑动窗口。起始点设置为索引为零的位置。当 和小于target时,窗口扩大。在和不小于target时,记录端点之差并后移左端点

需要注意的点:

  • 1、ansSum 的值应 初始化为多少?
    • 一种是 0 另一种 时数组 nums[0],不同的初始化值在循环中对应不同的处理。
  • 2、循环的条件是什么 ?
    • left <= right 保证了 可以左右指针均能遍历完数组 。
  • 3、跳出循环的条件是什么?
    • 第一种当然是遍历完了数组;
    • 第二种就是 right 作为索引却超出了索引最大值 (此时对应的情况为 ansSum小于target,再怎么操作也不会出现ansSum>=target的情况)
  • 4、如果数组之和小于 target 又应如何处理?
    • 如果没有对应的窗口,那么ans的值就不会改变。只需要判断ans的之就可以知道是否不存在了。
class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        int left = 0;
        int right = 0;
        int ans = INT_MAX;
        int ansSum= 0;	// 在这里我将求和的值初始化为零,那么在下面的循环中 ansSum的值就是本次循环的ansSum
        while(left<=right && ans != 1){	
            if(ansSum

螺旋矩阵 II

题目链接:螺旋矩阵 II

填充数组的方式有四种

  • 水平向右填充
  • 水平向左填充
  • 垂直向下填充
  • 垂直线向上填充

可以使用与4取余的方法判断对这一行或一列的填充方式

不妨规定

// 假定i为第i次填充
int i = 1;
while(i<=2*n){
	if(i%4==1){
		//水平向右填
	}else if(i%4==2){
		//垂直向下
	}else if(i%4==3){
		//水平向左
	}else if(i%4==0){
		//垂直向上
	}
}

那么我们就需要知道每一次填充,需要填充几个数字

也就是我们需要知道 当天填充行/列已经填充了几个数字 假定为 k

我们需要填充的就是 (n-k)个接下来的数字

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

继续分析 不难发现 :

  • 进行水平填充时 需要知道 填充了多少列

  • 进行垂直填充时 需要知道 填充了多少行

那么 我们就需要引入 两个变量 来分别记录已经填充的行和列的值

class Solution {
public:
    vector> generateMatrix(int n) {
        std::vector> arr(n,std::vector(n));
    // 假定i为第i次填充
    int i = 1;
    int num = 0;// 记录上一次填充时的结束数字
    int rows=1,cols=1;

    while(i<=2*n){
        int a,b;
        if(i%4==1){
            //水平向右填
            a = rows/2 ;
            b = cols/2;
            for(;b=cols/2;b--){
                arr[a][b] = ++num;
                
            }
            rows++;
        }else if(i%4==0){
            //垂直向上 
            a = n-rows/2;
            b = cols/2-1;
            for(;a>=rows/2;a--){
                arr[a][b] = ++num;
            }
            cols++;
        }
        i++;
    }
    return arr;
    }
};

你可能感兴趣的:(代码随想录训练,leetcode)