注意:
递减顺序 就是只能严格递减 两个元素不能相等
但是非递增顺序 可以元素相等
977.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector <int> a(nums.size());
int left=0,right=nums.size()-1;
int k=nums.size()-1;
while(left<=right){
if(nums[left]*nums[left]>=nums[right]*nums[right])
{
a[k--]=nums[left]*nums[left];
left++;
}
else{
a[k--]=nums[right]*nums[right];
right--;
}
}
return a;
}
};
非常简单的小题 二刷 典型的空间换时间 唯一注意的是(也是我的错误):不能用a[nums.size()-1] 这样a后面的没变化 永远都是那一个变量 只能用a[K] 用一个变量来替代
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int slow=0,fast=0,sum=0,result=nums.size()+1,length;
while(fast<nums.size()){
sum=sum+nums[fast];
while(sum>=target){
length=fast-slow+1;
result=result<length?result:length;
sum=sum-nums[slow++];
}
fast++;
}
if(result==nums.size()+1){
return 0;
}
else return result;
}
};
这道滑动窗格就花了不少时间 虽然是二刷 但是要是有很多问题
问题1 就是对于滑动窗格的理解不够 它其实是两层循环 而不是一层循环然后套一层if 因为内层的不只是减去一个就能刚刚好比target大的 所以是两层循环
问题2 因为这个是要更新result的值 来选取最小的 所以必须得有一个临时变量来保存之前最小的值 并且这个变量还要和现在的值相比较 但是有个问题就是这样还得区分第一次来给这个变量赋个值 就很麻烦 所以不如直接把result的值设为size+1 这样是最大的 比它小的直接就改就行 如果最后也没改那么就是return 0; 这样就很巧妙。 而不是说非得弄个临时变量 然后第一次用来记录这个值 然后后面几次再去相比较 当然经过后面的尝试也可以说是 第一次result是0 就去赋值 然后第二次再去比较 就是麻烦一点
像这样:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int slow=0,fast=0,sum=0,result=0,length;
while(fast<nums.size()){
sum=sum+nums[fast];
while(sum>=target){
length=fast-slow+1;
if(result==0){
result=length;
}
else {
result=result<length?result:length;
}
sum=sum-nums[slow++];
}
fast++;
}
if(result==0){
return 0;
}
else return result;
}
};
其实就是代码冗长了一点 而且不够巧妙 就是也可以但是可以简化一点 就统一 不用把第一次单列出来了 主要是得能想到把result 设为最大而不是0 。
第三道题 螺旋矩阵
这个题是第二次做 但是一上来还是没思路 关键是没理解二维矩阵 其实不管是这个钜阵有多少行 还是有多少列 它始终是二维的 因为三维数组是立体的 所以平面的就是二维。
另外还有一个问题就是 在二维数组赋值的时候不是只能一行一行的赋值 而是可以行先赋完再列赋 就是螺旋赋值
第三个问题就是循环不变量原则 在循环中不变的条件始终不变 左闭右开 就始终是左闭右开
第三个问题就是 要控制边界 ,那就必须有起始行和起始列,然后后面的边界再用n去减
第四个问题就是 还要有一个控制边界的offset 每次要增一 不用这个的话 直接用n--可能也写
第五个问题是 给二维数组赋值 不是赋坐标 而是直接赋 因为每个二维数组就已经是一个坐标了 只要赋值就可以了
第六个问题 还是要有一个offset变量 因为不能直接用n 那样会出问题 所以还要有i和j变量来封装n
第七个问题 就是因为第三个循环的时候 不能直接用n>0 要大于下界 所以起始变量也需要用i和j封装一下
第八个问题就是要区分奇偶 因为这是按四个边赋值的 会赋值四次 如果你中间只有一个值的话 就会把边上的一起也赋值了 那个就乱了
第九个问题就是 n是行而不是平方 不要搞混了
第十个问题:注意!注意! 数组下标是从0开始的 endy应该是n-1
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> a(n,vector<int>(n,0));
int startx=0,starty=0,count=1,endx=n-1,endy=n-1;
while(startx<endx){
for(int i=startx,j=starty;j<endy;){
a[i][j++]=count++;
}
for(int i=startx,j=endy;i<endx;){
a[i++][j]=count++;
}
for(int i=endx,j=endy;j>starty;){
a[i][j--]=count++;
}
for(int i=endx,j=starty;i>startx;){
a[i--][j]=count++;
}
startx++;starty++;endy--;endx--;
}
if(n%2==1){
a[n/2][n/2]=n*n;
}
return a;
}
};
截止到晚上22点做完 还是有点慢速