977. 有序数组的平方
解法一:暴力法
每个数平方后,再排个序。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0; i<nums.size(); i++)
nums[i]*=nums[i];
sort(nums.begin(), nums.end());
return nums;
}
};
解法二:双指针法
定义两个指针,从数组的两头向中间走,平方后大的值赋值给新数组。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>res(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]){
res[k--] = nums[i]*nums[i];
i++;
}else{
res[k--] = nums[j]*nums[j];
j--;
}
}
return res;
}
};
209.长度最小的子数组
解法一:暴力法
两层for循环,外层循环起始位置,内层循环终止位置。(会超出时间限制)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int minL=INT32_MAX;
int s=0,subL;
for(int i=0; i<nums.size(); i++){//起始位置
s=0;
for(int j=i; j<nums.size(); j++){//终止位置
s+=nums[j];
if(s>=target){
subL=j-i+1;
minL=min(minL,subL);
break;
}
}
}
return minL==INT32_MAX?0:minL;
}
};
解法二:滑动窗口
滑动窗口的关键在于根据当前子序列和大小的情况,不断调节子序列的起始位置,从而将O(n^2)暴力解法降为O(n)。
卡哥的视频讲解很详细,放上链接拿下滑动窗口! | LeetCode 209 长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int minL=INT32_MAX;//最小长度
int s=0,i=0,subL;
for(int j=0; j<nums.size(); j++){//终止位置
s+=nums[j];
while(s>=target){
subL=j-i+1;
minL=min(minL,subL);
s-=nums[i++];
}
}
return minL==INT32_MAX?0:minL;
}
};
59.螺旋矩阵II
第一次看到这道题时,有点晕,感觉有很多边界条件需要处理。直到我在题解中看到了下面的代码,简直是绝绝子!妙啊!!!
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n, vector<int>(n,0));
//上下左右边界
int t=0,b=n-1,l=0,r=n-1;
int num=1,i;
while(num<=n*n){
for(i=l; i<=r; i++)res[t][i]=num++;//从左到右
t++;
for(i=t; i<=b; i++)res[i][r]=num++;//从上到下
r--;
for(i=r; i>=l; i--)res[b][i]=num++;//从右到左
b--;
for(i=b; i>=t; i--)res[i][l]=num++;//从下到上
l++;
}
return res;
}
};