977.有序数组的平方
1暴力解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
for(int i=0; i<size; i++){
nums[i] = nums[i] * nums[i];
}
sort(nums.begin(), nums.end());
return nums;
}
};
2 双指针
想到了双指针但是只考虑了两端比谁小,没有考虑到是两者比谁大,大的放后面。
vector 在用[]赋元素时要初始化大小,比如vector<int> nums(size),不然会报错runtime error: reference binding to null pointer of type。
d
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
int l=0, r=size-1;
vector<int> ans(size);
int i=size-1;
while(l<=r){
if(nums[l]*nums[l] >= nums[r]*nums[r]){
ans[i] = nums[l]*nums[l];
l++;
i--;
}
else {
ans[i] = nums[r]*nums[r];
r--;
i--;
}
}
return ans;
}
};
209.长度最小的子数组
思路:滑动窗口,快指针跟着遍历走,关键在于慢指针的移动,需要循环判断(while)数组和是否大于等于目标值,不能只判断一次。
不要忘记对于全部和小于目标值的情况需要单独判断。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int size = nums.size();
int l=0, r=0;
int count = INT32_MAX;
int len = INT32_MAX;
int sum = 0;
for(r; r<size; r++){
sum += nums[r];
while(sum >= target){
sum -= nums[l];
len = r-l+1;
l++;
}
if(len < count) count = len;
}
return count==INT32_MAX? 0:count;
}
};
59.螺旋矩阵II
思路:首先要初始化一个空的vector,遍历顺序按照左-右,上-下,右-左,下-上,按照前闭后闭,每遍历一个元素,就把元素赋值给vector中对应的位置,每遍历完一行/列就更新下一次遍历的起始位置。
最后在外面套一个while循环,因为不止有一圈。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t = 0;
int l = 0;
int b = n-1;
int r = n-1;
int count = 1;
vector<vector<int>> ans(n, vector<int>(n));
while(count <= n*n){
for(int i=l; i<=r; i++) ans[t][i] = count++;
t++;
for(int i=t; i<=b; i++) ans[i][r] = count++;
r--;
for(int i=r; i>=l; i--) ans[b][i] = count++;
b--;
for(int i=b; i>=t; i--) ans[i][l] = count++;
l++;
}
return ans;
}
};