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());
return nums;
}
};
然而题目要求时间复杂度为o(n),暴力解法时间复杂度为o(n+nlogn)。
看了题解后发现可以利用双指针解法,因为对含有负数的有序数组,最大值只能在数组的两端,因此用两个指针分别指向数组的起点和末尾,对两个指针指向的值的平方进行计算,判断。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n=nums.size()-1;
vector<int> result(n+1,0);
for(int i=0,j=n;i<=j;){
if(nums[i]*nums[i]<nums[j]*nums[j]){
result[n]=nums[j]*nums[j];
n--;
j--;
}
else{
result[n]=nums[i]*nums[i];
i++;
n--;
}
}
return result;
}
};
209.长度最小的子数组
暴力解法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;
int sum=0;
int l=0;
for(int i=0;i<nums.size();i++){
sum=0;
for(int j=i;j<nums.size();j++){
sum+=nums[j];
if(sum>=target){
l=j-i+1;
result=min(l,result);
break;
}
}
}
return result==INT32_MAX?0:result;
}
};
然而利用暴力解法因为利用两层for循环而超出时间限制。可以选用双指针的方法。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;
int sum=0;
int l=0;
int i=0;
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
l=j-i+1;
result=min(l,result);
sum-=nums[i];
i++;
}
}
return result==INT32_MAX?0:result;
}
};
59.螺旋矩阵||
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int loop=n/2;//loop表示循环的圈数
int mid=n/2;
int startx=0,starty=0;//表示每循环一圈的开始位置
int count=1;//给新矩阵赋值
int offset=1;//每一圈循环中每一条边遍历的位置
int i,j;
vector<vector<int>> res(n,vector<int>(n,0));
while(loop--){
for(j=starty;j<n-offset;j++){//从左到右遍历
res[startx][j]=count++;
}
for(i=startx;i<n-offset;i++){//从上到下遍历
res[i][j]=count++;
}
for(;j>starty;j--){//从右往左遍历
res[i][j]=count++;
}
for(;i>startx;i--){//从下往上遍历
res[i][j]=count++;
}
startx++;
starty++;
offset+=1;
}
if(n%2){
res[mid][mid]=count;
}
return res;
}
};