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

977.有序数组的平方

    • 1,因为是有序数组,所以会导致,两边大,中间小
    • 2,又因为要排序所以可以仿照这个特点
    • 3,从首尾两端,进行排序
  •   代码:
  •  1 //平方之后,列顺序 从低到高
     2 vector<int> sortedSquares(vector<int>& nums) 
     3 {
     4     vector<int> result(nums.size());
     5     int resultId = nums.size() - 1;
     6 
     7     //因为有序数组,所以他是两边最大,中间最小,所以可以 从两边往里,找出来最大的数值
     8     //注意可以不加 l++ r --
     9     for (int l = 0, r = nums.size() - 1; l <= r;)
    10     {
    11         int l_sq = nums[l] * nums[l];
    12         int r_sq = nums[r] * nums[r];
    13         if (l_sq > r_sq)
    14         {
    15             result[resultId] = l_sq;
    16             l++;
    17         }
    18         else //如果等于的话,是社么情况
    19         {
    20             result[resultId] = r_sq;
    21             r--;
    22         }
    23         resultId--;
    24     }
    25 
    26     return result;
    27 }

长度最小的数组:

1,滑动窗口

注意:

1,起始位置,是要放到最外边

2,只对sum_ 进行while循环,而不是对起始位置,因为起始位置是要动的

3,minLen需要修改

 

 

 1 int minSubArrayLen(int target, vector<int>& nums)
 2 {
 3     vector<vector<int>> resultList;
 4 
 5     int minLen = INT32_MAX; // INTMax_max不是最大
 6     
 7     int sum_ = 0;
 8     //注意 起始位置 不是每次都是从0开始的
 9     int i = 0;
10     for (int j = 0; j < nums.size(); j++)
11     {
12         sum_ += nums[j];
13 
14         while (sum_ >= target)
15         {
16             minLen = min(minLen, j - i + 1); // NOTE:需要在 I 之前
17             sum_ -= nums[i];
18             i++;
19         }
20     }
21 
22     //注意,没有的话,设置成0
23     return minLen == INT32_MAX ? 0 : minLen;
24 }

 螺旋矩阵

难点:

  1,想象怎么转圈

  2,意识到转几次圈

  3,边界值应该怎么选

代码:

 1 vector<vector<int>> generateMatrix(int n)
 2 {
 3     vector<vector<int>> result(n, vector<int>(n, 0));
 4 
 5     // 难点在于怎么转圈 
 6     // 以一圈为单位,进行统计
 7     int startX = 0, startY = 0, subNum = 1;
 8     int circleNum = 0;
 9     int val_ = 1;
10     //注意奇数的情况
11     while (circleNum < (n / 2))
12     {
13         // i = 0; J 0 -> n -subNum
14         for (int j = startY; j < (n - subNum); j++)
15         {
16             result[startX][j] = val_++;
17         }
18         // J = n-subNum, I startX -> n-subNum
19         for (int i = startX; i < (n - subNum); i++)
20         {
21             result[i][n - subNum] = val_++;
22         }
23         // I = n -SubNum; J n-subNum -> startY
24         for (int j = n - subNum; j > startY; j--)
25         {
26             result[n - subNum][j] = val_++;
27         }
28         // J = startY I : n-subNum -> startX 
29         for (int i = n - subNum; i > startX; i--)
30         {
31             result[i][startY] = val_++;
32         }
33 
34         startX++;
35         startY++;
36         subNum++;
37         circleNum++;
38     }
39 
40     if (n % 2 != 0)
41     {
42         result[n / 2][n / 2] = n * n;
43     }
44     
45     return result;
46 }

 

 

 

posted @ 2023-06-08 23:53  博二爷  阅读(159)  评论(0编辑  收藏  举报