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

977题没什么好说的,找到中间第一个非负值,以此为起点向左、向右分别遍历即可。

复制代码
 1 class Solution {
 2 public:
 3     vector<int> sortedSquares(vector<int>& nums) {
 4         //找到第一个非负值 然后依次比较填入新数组中
 5         //注意vec的语法使用
 6         //左右指针 分别计数 能达到O(n)的时间要求
 7         vector<int> ans(nums.size());
 8         int i = 0;
 9         while (i < nums.size() && nums[i] < 0) {
10             i++;
11         }
12         int left = i - 1;
13         int right = i;
14         int len = 0;
15         while (left >= 0 && right < nums.size()) {
16             if (nums[right] * nums[right] <= nums[left] * nums[left]) {
17                 ans[len++] = nums[right] * nums[right];
18                 right++;
19             }
20             else {
21                 ans[len++] = nums[left] * nums[left];
22                 left--;
23             }
24         }
25         if (left >= 0) {
26             while(left >= 0) {
27                 ans[len++] = nums[left] * nums[left];
28                 left--;
29             }
30         }
31         else {
32             while(right < nums.size()) {
33                 ans[len++] = nums[right] * nums[right];
34                 right++;
35             }
36         }
37         return ans;
38     }
39 };
复制代码

 

  

209题就是滑动窗口

复制代码
 1 class Solution {
 2 public:
 3     int minSubArrayLen(int target, vector<int>& nums) {
 4         //
 5         int left = 0;
 6         int right = 0;
 7         int sum = 0;
 8         int len = 0;//记录当前子数组长度
 9         int min = nums.size() + 1;//记录满足条件的最短子数组长度
10         while ( right < nums.size() ) {
11             if ( sum < target ) {
12                 sum += nums[right++];
13                 len++;
14             }
15             else {
16                 sum = sum - nums[left++];
17                 len--;
18             }
19             if (sum >= target && len <= min ) {
20                 min = len;
21             }
22         }
23         while (left <= right && sum >= target) {
24             sum = sum - nums[left++];
25             len--;
26             if (sum >= target && len <= min ) {
27                 min = len;
28             }
29         }
30         return (min < nums.size() + 1)?min:0;
31     }
32 };
复制代码

 

  

59题的方法比较笨,但感觉也算实用的,就是注意四个方向的转向循环填入数字,但是如果题目稍微变一下,跳着填入数字,估计这个写法就用不了了。

复制代码
 1 class Solution {
 2 public:
 3     vector<vector<int>> generateMatrix(int n) {
 4         if (n == 1) {
 5             vector<vector<int>> ans(1, vector<int>(1,1));;
 6             return ans;
 7         }
 8         int t = 1;
 9         vector<vector<int>> ans(n, vector<int>(n,-1));
10         int i = 0, j = 0;
11         // string dir[] = {"right", "left", "down", "up"};
12         // string flag;
13         // flag = dir[0];
14         while (t <= n*n) {
15             for (; j < n && ans[i][j] == -1;) {
16                 ans[i][j] = t++;
17                 if( j < n-1 && ans[i][j+1] == -1 ) {
18                     j++;
19                 }
20             }
21             i++;
22             for(;i < n && ans[i][j] == -1;) {
23                 ans[i][j] = t++;
24                 if( i < n-1 && ans[i+1][j] == -1  ) {
25                     i++;
26                 }
27             }
28             j--;
29             for(;j > -1 && ans[i][j] == -1;) {
30                 ans[i][j] = t++;
31                 if( j > 0 && ans[i][j-1] == -1 ) {
32                     j--;
33                 }
34             }
35             i--;
36             for(;i > -1 && ans[i][j] == -1;) {
37                 ans[i][j] = t++;
38                 if( i > 0 && ans[i-1][j] == -1 ) {
39                     i--;
40                 }
41             }
42             j++;
43         }
44         return ans;
45     }
46 };
复制代码

 

posted @   清源风起时  阅读(705)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示