代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
977.有序数组的平方
之前做过
int n = nums.size();
vector<int> ans(n);//给ans初始化
for(int i = 0,j=n-1,pos =n-1;i<=j;)
{
if(-nums[i]>nums[j])
{
ans[pos] = nums[i]*nums[i];
++i;
}else{
ans[pos] = nums[j]*nums[j];
--j;
}
--pos;
}
return ans;
}
209.长度最小的子数组
如果break语句包含在嵌套循环里,它只跳出最里面的循环。
暴力解法超时:
int n = nums.size();
int ans = __INT_MAX__;
for (int i = 0; i < n; i++)
{
int sum = 0;
for (int j = i; j < n; j++)
{
sum+=nums[j];
if (sum>=target)
{
ans = min(ans,j-i+1);
break;
}
}
}
return ans == __INT_MAX__?0:ans;
双指针向中间滑动
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int NumSize=nums.size();
int start = 0,end = 0;
int ans = __INT_MAX__;
int sum = 0;
while(end<NumSize)
{
sum+=nums[end];
// end++;
while (sum>=target)//不要忘记等于号
{
ans = min(ans,end - start+1);
sum-=nums[start];
start++;
}
end++;
}
return ans == __INT_MAX__?0:ans;//不要忘记判断输入是否为空
}
};
59.螺旋矩阵II
#include<vector>
using namespace std;
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int top= 0,left= 0;
int bottom= n - 1,right = n - 1;
int pos = 1;
vector<vector<int>> ans_matix(n,vector<int>(n));
while (pos<=n*n)
{
/* code */
for(int i=left;i<=right;i++,pos++)
{
ans_matix[top][i]=pos;
}
top++;
for(int i=top;i<=bottom;i++,pos++)
{
ans_matix[i][right] = pos;
}
right--;
for (int i = right; i >= left; i--,pos++)
{
ans_matix[bottom][i] = pos;
}
bottom--;
for (int i = bottom; i >= top; i--,pos++)
{
ans_matix[i][left] = pos;
}
left++;
}
return ans_matix;
}
};
注意top由小到大,bottom由大到小
用start和end代替。