Leetcode:977.有序数组的平方
文档讲解:[代码随想录]
题目链接:977.有序数组的平方
状态:ok
题目:
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思想:
用双指针从数组两侧分别遍历,最外侧的平方一定是大数。
注意:
1.注意 l 和 r 的取值范围
2.双指针方法的时间较慢,未来可以使用其他方法:例如排序
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> nums2 = nums;int l = 0;int r = nums.size() - 1;for(int i = nums2.size() - 1; i >= 0; i--){if(nums[l] * nums[l] > nums[r] * nums[r]){nums2[i] = nums[l] * nums[l];l++;cout<<nums2[i];}else if(nums[l] * nums[l] <= nums[r] * nums[r]){nums2[i] = nums[r] * nums[r];r--;cout<<nums2[i];}}return nums2;}
};
209.长度最小的子数组
文档讲解:[代码随想录]
题目链接: 209.长度最小的子数组
状态:ok 滑动窗口思想
题目:
找出该数组中满足其总和大于等于 target 的长度最小的 连续
子数组
[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
注意:
1.一开始使用暴力方式,会导致时间超限
2.很简单的滑动窗口思想,理解了之后代码比较好编写
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int i = 0;int minlen = nums.size() + 2;int sum = 0;for(int j = 0; j < nums.size(); j++){sum += nums[j];while(sum >= target){int len = j - i + 1;if(len < minlen){minlen = len;}sum -= nums[i];i++;}}if(minlen > nums.size())return 0;else return minlen;}
};
59.螺旋矩阵II
文档讲解:[代码随想录]
题目链接:59.螺旋矩阵II
状态:ok 左闭右开原则
题目:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
注意:
1.代码随想录当中的左闭右开原则要清楚
2.每次循环一圈之后的startx和starty的位置都要变化
3.讨论n为奇数偶数的两种情况
class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int sum = n / 2;int num = 1;int startx = 0;int starty = 0;int i,j;int number = 1;while(sum--){i = startx;j = starty;for(j = starty; j < n - num; j++){res[i][j] = number;number++;}for(i = startx; i < n - num; i++){res[i][j] = number;number++;}for(;j >= num; j--){res[i][j] = number;number++;}for(;i >= num; i--){res[i][j] = number;number++;}num++;startx++;starty++;}if(n%2 != 0){res[n/2][n/2] = number;}return res;}
};