学习目标:
day2:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
学习内容:
有序数组的平方:双指针可以有效降低数组问题的复杂度;
长度最小的子数组:错误理解:排序后从后往前记录个数,这种方法并不是最小的子集合
螺旋矩阵:模拟题 注意边界 循环不变量
学习时间:
2022年10月27日
学习产出:
有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
vector<int> res(nums.size(),0);
int k = nums.size()-1;
while(left<=right){
if(nums[left]*nums[left]<=nums[right]*nums[right]){
res[k--]=nums[right]*nums[right];
right--;
}
else{
res[k--]=nums[left]*nums[left];
left++;
}
}
return res;
}
};
长度最小子数组(错误思路)
class Solution {
private:
int count =0;
int res=0;
public:
int minSubArrayLen(int target, vector<int>& nums) {
sort(nums.begin(),nums.end());
int k = nums.size()-1;
if(nums[k]>=target) return 1;
else{
while(res<target){
res+=nums[k];
k--;
count++;
if(k==-1&&res>=target) return count;
else if(k==-1&&res<target) return 0;
else continue;
}
return count;
}
}
};
长度最小数组(滑动窗口)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int i = 0;
int result = INT32_MAX;
int sublength=0;
for(int j = 0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
sublength=(j-i+1);
result=result>=sublength?sublength:result;
sum-=nums[i++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
螺旋矩阵
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int startx=0;
int starty=0;
int offset=1;
int count =1;
int loop=n/2;
int i,j;
int mid = n/2;
vector<vector<int>> nums(n,vector<int>(n,0));
while(loop--){
i = startx;
j = starty;
for(j = starty;j<n-offset;j++){
nums[startx][j]=count++;
}
for(i = startx;i<n-offset;i++){
nums[i][j]=count++;
}
for(;j>starty;j--){
nums[i][j]=count++;
}
for(;i>startx;i--){
nums[i][j]=count++;
}
startx++;
starty++;
offset++;
}
if(n%2==1) nums[mid][mid]=count;
return nums;
}
};