第一章 数组part02
977.有序数组的平方
题目建议: 本题关键在于理解双指针思想
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录
简单思路
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0 ; i<nums.size();i++){
nums[i] = nums[i] * nums[i];
} // 先平方
sort(nums.begin(),nums.end()); //再排序
return nums;
}
};
双指针:
一边对头尾的数字进行平方,一边比较大小,从后向前生成最后vector:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> A(nums.size(),0);
int k =nums.size()-1;
//边比较边生成
for(int i = 0 , j = nums.size()-1; i<=j;){
if(nums[i]*nums[i]>=nums[j]*nums[j]){
A[k] = nums[i]*nums[i];
i++;
k--;
}else if (nums[i]*nums[i]<nums[j]*nums[j]){
A[k] = nums[j]*nums[j];
j--;
k--;
}
}
return A;
}
};
209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录
注意,大于等于
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int result = INT32_MAX; int sum = 0; int sublenghth = 0; int i = 0; for(int j = 0; j < nums.size();j++){ sum += nums[j]; while(sum >= target){ sublenghth = (j - i + 1); // 取子序列的长度 result = result<sublenghth ? result:sublenghth ;//将更小的区间储存下来 sum -= nums[i++];//往后划 } } return result == INT32_MAX ? 0 :result; } };
59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录
把每一圈,视作一个循环,,每一圈,执行四个循环的赋值,下一圈,重新定义起始位置和最大限制,再赋值,若是奇数,记得中间也要赋值。
class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n, vector<int>(n,0)); int num = 1; int loop = n/2; //一圈为一个loop int startx = 0; int starty = 0; int limit = n-1; int i,j; int mid = n / 2; while(loop--){ i = startx; j = starty; for(j = starty; j<limit;j++){ res[startx][j] = num; num++; } for(i = startx; i<limit;i++){ res[i][j] = num; num++; } for(;j > starty;j--){ res[i][j] = num; num++; } for(;i > startx;i--){ res[i][j] = num; num++; } startx++; starty++; limit-=1; } // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值 if (n % 2) { res[mid][mid] = num; } return res; } };
总结
题目建议:希望大家 也做一个自己 对数组专题的总结
文章链接:代码随想录