- 抓住题目特点,有序数组的平方,所以最大值出现在最左边或者最右边
- 双指针法,指向指针的开头和结尾,比较哪个值更大,然后放到新数组里,再移动
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size(),0);
int k=nums.size()-1;
int st=0,ed=nums.size()-1;
while(st<=ed){//<=要注意
if(nums[st]*nums[st]>nums[ed]*nums[ed]){
res[k]=nums[st]*nums[st];
k--;
st++;
}
else{
res[k]=nums[ed]*nums[ed];
k--;
ed--;
}
}
return res;
}
};
- 可以直接暴力,两层循环嵌套,复杂度高
- 滑动窗口法(可以理解为动态的双指针,但是更关注的是两个指针中间即窗口的部分)
-
三点:窗口内,如何移动起始位置,如何移动结束位置
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res=INT32_MAX;
int len,sum=0,st=0,ed=0;
for(;ed<nums.size();ed++){//只用了一层循环,怎么确定的结束位置作为循环条件
sum+=nums[ed];
while(sum>=target){
len=ed-st+1;
res=res<=len?res:len;
sum-=nums[st];
st++;
}
}
if(res==INT32_MAX)
return 0;
else return res;
}
};
-
模拟,用到了二分法的循环不变量思想(什么在变,什么不变)
本题,从左往右,从上至下,从右往左,从下到上,顺序是不变的 -
设置好几个需要用到的变量:循环次数,每次循环一条边的边上数的个数,每次循环的起始位置,考虑n的奇偶性
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int loop=n/2;
int startx=0,starty=0;
int offset=1;
int i,j;
int num=1;
while(loop--){
for(i=startx,j=starty;j<n-offset;j++){
res[i][j]=num;
num++;
}
for(;i<n-offset;i++){
res[i][j]=num;
num++;
}
for(;j>startx;j--){
res[i][j]=num;
num++;
}
for(;i>starty;i--){
res[i][j]=num;
num++;
}
i=startx++;
j=starty++;
offset++;//第一遍写的时候,offset没有自加,导致遍历多了,数组值被替换,值变大了
}
if(n%2!=0)
res[n/2][n/2]=n*n;
return res;
}
};