977.有序数组的平方
代码如下:
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[j]*nums[j];
j--;
}else{
res[k--] = nums[i]*nums[i];
i++;
}
}
return res;
}
};
双指针,时间复杂度O(n)
另外一提,先平方然后用标准库函数sort排序是更容易想到的方法。sort()接受两个迭代器,第三个参数决定排序方式。
209.长度最小子数组
最直接的解法是暴力求解,两层循环,O(n^2)的复杂度,看卡哥的视频,用滑动窗口,代码如下:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = nums.size()+1; //记录结果
for(int i=0,j=0,sum=0,len=0;j<nums.size();j++){
sum +=nums[j];
while(sum >= target){
len = j-i+1;
res = res < len ? res : len;//取较小的一个
sum-=nums[i++];
}
}
return res == nums.size()+1 ? 0 : res;
}
};
顺便一提, sum-=nums[i++];这样的是c艹的后缀表达式写法,示例如下:
int a = 5;
int b = a--; // 后缀递减,b的值为5,a的值变为4
三元运算符,语法如下:
condition ? expression_if_true : expression_if_false;
59.螺旋矩阵2
代码如下
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int loop = n/2;
int count = 1;
int mid = n/2;
int offset = 1;//控制边界
int start_x =0, start_y =0;
int i ,j ;
for(;loop>0;loop--){
i = start_x;
j = start_y;
for(;j<n-offset;j++){ //这里j一定要赋值吗?
res[i][j]=count++;
}
for(;i<n-offset; i++){
res[i][j] = count++;
}
for(;j>start_y;j--){
res[i][j]= count++;
}
for(;i>start_x; i--){
res[i][j]= count++;
}
start_x++;
start_y++;
offset++;
}
if(n%2){
res[mid][mid] = count;
}
return res;
}
};
注意循环不变量,另外循环内赋值并不是必要的。
数组总结
明天再写啦,累鼠。