代码随想录算法训练营第二天| 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 };
自在飞花轻似梦

浙公网安备 33010602011771号