代码随想录Day2(977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II)
977.有序数组的平方
思路:双指针,merge
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> result(n);
// all positive or zero
if(nums[0]>=0){
for(int i=0; i<n; i++){
result[i] = pow(nums[i], 2);
}
return result;
}
// all negative
if(nums[n-1]<0){
for(int i=0; i<n; i++){
result[i] = pow(nums[n-i-1],2);
}
return result;
}
// otherwise, find the boundary
int i=0, j;
for(;i<n;i++){
if(nums[i]>=0){
j = i;
i = i-1;
break;
}
}
int a = 0;
while(i>=0 && j<n){
if(abs(nums[i])<=abs(nums[j])){
result[a] = pow(nums[i],2);
i--;
a++;
}
else{
result[a] = pow(nums[j],2);
j++;
a++;
}
}
if(i<0){
while(j<=n-1){
result[a] = pow(nums[j],2);
j++;
a++;
}
}
if(j>=n){
while(i>=0){
result[a] = pow(nums[i],2);
i--;
a++;
}
}
return result;
}
};
209.长度最小的子数组
思路:循环超时了,要用滑动窗口。循环移动终止位置,当元素和大于target时,移动起始位置缩小窗口。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int result = INT32_MAX;
int i = 0;
int sum = 0;
for(int j=0;j<=n-1;j++){
sum = sum + nums[j];
while(sum>=target){
int length = j-i+1;
result = min(result, length);
sum = sum - nums[i];
i++;
}
}
if(i==0){
return 0;
}
return result;
}
};
//循环方法,超时
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int min_length = INT32_MAX;
if(n==1&&nums[0]>=target){
return 1;
}
if(n==1&&nums[0]<target){
return 0;
}
for(int i=0; i<n; i++){
int j = i;
int sum = 0;
int count = 0;
while(j<n){
sum = sum+nums[j];
count++;
j++;
if(sum>=target){
min_length = min(min_length, j-i);
break;
}
else{
if(count >= min_length){
break;
}
}
}
}
if(min_length==INT32_MAX){
return 0;
}
else return min_length;
}
};
59.螺旋矩阵II
思路:按右下左上的顺序依次填入,遇到非零元素或边界就转向。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int i = 0;
int j = 0;
int num = 1;
int maxnum = n*n;
vector<vector<int>> result(n, vector<int>(n,0));
result[i][j] = num;
while(num<maxnum){
while(j+1<n && result[i][j+1]==0){
j++;
num++;
result[i][j] = num;
}
while(i+1<n && result[i+1][j]==0){
i++;
num++;
result[i][j] = num;
}
while(j-1>=0 && result[i][j-1]==0){
j--;
num++;
result[i][j] = num;
}
while(i-1>=0 && result[i-1][j]==0){
i--;
num++;
result[i][j] = num;
}
}
return result;
}
};
总结
双指针和滑动窗口思想。