一、双指针法 O(n)时间复杂度:有序数组的平方
一维数组初始化:
vector<int> V (m,n)
m指有多少个n, 即数组容量,n为初始化的赋值。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> result(nums.size(),0); //一维数组初始化,细看! lc给出的样板文件是&引用的意思
for(int i=0,j=nums.size()-1;i<=j;){ //int i, int j; i<=j报错 不可写两遍int
if(nums[i]*nums[i]>nums[j]*nums[j]){
result[k--]=nums[i]*nums[i];//等效写法 result[k]=nums[i]*nums[i];k--
i++;
}
else{
result[k--]=nums[j]*nums[j];
j--;
}
}
return result;//第一遍写了result[k],事实上应该返回整个数组
}
};
二、滑动窗口 双指针:长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0;
int sum=0;
int sublength=0;//更新的滑动窗口的长度
int result=INT32_MAX;//WHY? why not result=nums.size() 给一个极大值
for(int j=0;j<nums.size();j++){//这里漏写j=0执行错误
sum+=nums[j];
while(sum>=target){
sublength=(j-i+1);
result=(result<sublength)?result:sublength;//min(result,sublength)
sum-=nums[i++];//实际上要一直循环下去
}
}
return result==INT32_MAX?0:result; //确定是否返回0,如果result没有被赋值 没有进入过while循环
}
};
三、循环判定的边界条件:螺旋矩阵
二维数组初始化:
vector<vector<int>> result(n,vector<int>(n,0)); n行*n列
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n,0));
int startX=0,startY=0;//每一次左上角转圈的起始点
int offset=1;//每一圈往内缩进
int count=1;//每个方格内按序填充的值
int i,j;//每个网格的坐标点,以数组的0,1,2,3开始编
int loop=n/2;
while(loop--){//没有写--循环卡死
i=startX;
j=startY;
for(j=startY;j<n-offset;j++){//第一次写没有把startX,Y放入循环见鬼
result[startX][j]=count++;
}
for(i=startX;i<n-offset;i++){
result[i][j]=count++;
}
for(;j>startY;j--){//这里弄混了startY,j&startY
result[i][j]=count++;
}
for(;i>startX;i--){//这里弄混了startX,j&startX
result[i][j]=count++;
}
startX++;
startY++;
offset++;
}
if(n%2==1){
result[n/2][n/2]=count;//最后一个count赋值 先加后赋值 和++i不同 这里写[i][j]循环错误
}
return result;
}
};