今天是打卡第二天,废话不多说,看题,链接如下:
这道题因为数据范围在10的4次方 ,数据不大所以我们直接进行平方
然后用一个C++自带的sort函数,就那么轻松的写出来了
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;
}
};
但是有没有更巧妙的方法,当然有,双指针它又来了
能使用双指针的原因是因为最大的数永远在平方后数组的两端,然后依次往内缩小
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//初始化容器
vector<int>res(nums.size(),0);
//倒序放入新容器
int k = nums.size()-1;
//先不要i++,j-- 符合条件再更新二者其一,i为左指针,j为右指针
for(int i = 0, j = nums.size()-1; i<=j; ){
//更新操作
if(nums[i]*nums[i] > nums[j]*nums[j]){
res[k--] = nums[i]*nums[i];
i++;
}else{
res[k--] = nums[j]*nums[j];
j--;
}
}
return res;
}
};
时间复杂度为O(n)。
209题链接如下
这是一道滑动窗口的题目,一般的滑动窗口还是会做的,但是这个窗口大小会改变就让我有点摸不着头脑,如果窗口大小变就是队列了吧
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i = 0, res = INT32_MAX;
int sum = 0;
//j表示终点位置 i是循环不变量
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
int len = j-i+1;
res = min(len,res);
sum -= nums[i];
i++;
}
}
return res ==INT32_MAX ? 0 : res;
}
};
要注意res要取一个最大值INT32_MAX而不是nums.size()
59题链接如下59. 螺旋矩阵 II
这个之前自己写过类型的矩阵问题,用的是坐标的方法,也感觉这个方法更好懂
#include<iostream>
using namespace std;
int q[100][100];
int main(){
int n,m;
cin>>n>>m;
int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0};
for(int x = 0,y=0,d=0,k=1; k<=n*m;k++){
q[x][y] = k;//k计数 此次递增
int a = x+dx[d], b=y+dy[d];//初始位置0,0
if(a<0 || a>=n ||b<0 ||b>=m ||q[a][b] ){//判断边界
d=(d+1)%4;//转方向 依次右下左上
a=x+dx[d],b=y+dy[d];//加上偏移量
}
x=a,y=b;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",q[i][j]);
}
printf("\n");
}
return 0;
}