代码随想录算法训练营第二天| 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 }