补第二天 2023-9-24
977.有序数组的平方
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());
for(int j=1;j<nums.size();j++)
{
for(int k=0;k<nums.size()-j;k++)
{
if(nums[k]>nums[k+1])
swap(nums[k],nums[k+1]);
}
}
return nums;
}
};
用了冒泡排序,时间复杂度n2,无法满足要求,其实还能直接使用sort函数,但是没必要
双指针法:(看答案才能写出来,需要巩固)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> res(nums.size(),0);
for(int i=0,j=k;i<=j;)
{
if(nums[i]*nums[i]>nums[j]*nums[j])
{
res[k--]=nums[i]*nums[i];
i++;
}else{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
};
双指针法,这个时间复杂度n,但是总是想不起来,循环条件怎么写
209.长度最小子数组(看答案)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0;
int result=INT32_MAX;
int sub_length=0;
int sum=0;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
sub_length=j-i+1;
result=result<sub_length?result:sub_length;
sum-=nums[i++];
}
}
return result==INT32_MAX?0:result;
}
};
这是使用了滑动窗口法来解决的,也有暴力解法
59.螺旋矩阵(之前做过是有一点印象的,但是需要注意的变量太多了,还是看了答案才能写出来)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int loop=n/2; //循环圈数
int mid=n/2; //中间位置
int startx=0,starty=0;
int i,j;
int count=1; //每次赋值后+1,最后刚好还能给单数n赋值
int offet=1; //可以理解为偏移量,第一圈为1第二圈为2,,,
while(loop--)
{
i=startx;
j=starty;
//开始四个循环,左闭右开
//1.从左到右
for(;j<n-offet;j++)
{
res[startx][j]=count++; //出了循环 j=2
}
//2.从上到下
for(;i<n-offet;i++)
{
res[i][j]=count++; //出循环 i=2
}
//3.从右到左
for(;j>starty;j--)
{
res[i][j]=count++; //出循环时 j=0
}
//4.从下到上
for(;i>startx;i--)
{
res[i][j]=count++; //出循环 count会多一个++后的数,如果n双数,就不用管,否则还需要单独对中间那个数赋值
}
startx++;
starty++;
offet++; //偏移量也得加上,用到下一圈
}
if(n%2)
{
res[mid][mid]=count;
}
return res;
}
};
感觉还是没有那个思维,还是练的太少了!!!