leetcode977.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res;
//左闭右闭区间
int left=0,right=nums.size()-1;
while(left<=right){
if(square(nums[left])>=square(nums[right])){
res.push_back(square(nums[left]));
left++;
}else{
res.push_back(square(nums[right]));
right--;
}
}
reverse(res);
return res;
}
int square(int num){
return num*num;
}
//可以先创建对应长度的数组倒着写入就可以不用reverse了
void reverse(vector<int>& nums){
int temp=0;
for(int i=0,j=nums.size()-1;i<j;i++,j--){
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
return;
}
};
leetcode209.长度最小的子数组
class Solution {
public:
// //暴力循环
// int minSubArrayLen(int target, vector<int>& nums) {
// int sum=0;
// int len=INT_MAX;
// int subLen=0;
// for(int i=0;i<nums.size();i++){
// sum=0;
// subLen=0;
// for(int j=i;j<nums.size();j++){
// sum+=nums[j];
// subLen++;
// if(sum>=target){
// setLen(len,subLen);
// }
// }
// }
// return len==INT_MAX?0:len;
// }
//滑动窗口
int len=INT_MAX;
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int left=0;
int subLen=0;
for(int right=0;right<nums.size();right++){
subLen++;
sum+=nums[right];
while(sum>=target){
sum-=nums[left++];
subLen--;
setLen(len,subLen+1);
}
}
return len==INT_MAX?0:len;
}
void setLen(int &len,int num){
if(num<len){
len=num;
}
return;
}
};
leetcode59.螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//根据观察圈数是n/2得到的,只不过奇数项最后还需要处理一个中间点
vector<vector<int>> res(n,vector<int>(n,0));
// int startI=0,startJ=0;
int num=1;
int offset=0;
int i=0,j=0;
for(int index=0;index<n/2;index++){
//确定循环圈数
//采用左闭右开原则
for(;j<n-1-offset;j++){
res[i][j]=num++;
}
for(;i<n-1-offset;i++){
res[i][j]=num++;
}
for(;j>0+offset;j--){
res[i][j]=num++;
}
for(;i>0+offset;i--){
res[i][j]=num++;
}
offset++;
i++;
j++;
}
if(n%2!=0){
res[n-1-offset][n-1-offset]=num;
}
return res;
}
};
59题是个很好的题目,可以复习优化让其中的变量更少