一、977.有序数组的平方
1.题目
2.解题思路
暴力法:for循环+排序O(nlogn)
双指针法:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size()-1;
vector<int> result(nums.size(),0);//初始化
for(int i = 0,j=nums.size()-1;i<=j;){
if(nums[j]*nums[j] > nums[i]*nums[i]){
result[k--] = nums[j]*nums[j];
j--;
}
else{//小于等于。左闭
result[k--]= nums[i]*nums[i];
i++;
}
}
return result;//O(n)
}
};
二、209.长度最小的子数组
1.题目
2.解题思路
暴力法:O(n^2+n)
LeetCode编译超时:
滑动窗口法:O(n)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int first = 0;
int last;
int result = nums.size()+1;
int sum = 0;
int length = 0;
for(last = 0;last<nums.size();last++){
sum += nums[last];
while(sum >= target){
length = last -first+1;
result = min(result,length);
sum -= nums[first];
first++;
}
}
//不符合条件
if(result == nums.size()+1){
return 0;
}
return result;
}
};
三、59.螺旋矩阵II
1.题目
2.解题思路
注意循环不变量和由外向内时的边界变化!
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> nums(n, vector<int>(n, 0)); // 初始化
int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
int loop = n / 2; //循环次数
int mid = n / 2;
int count = 1;
int offset = 1; // 每次循环后加1
int i,j;
while (loop --) {
i = startx;
j = starty;
// for循环就是转一圈,左闭右开
for (j = starty; j < n - offset; j++) {
nums[i][j] = count++;
}
for (i = startx; i < n - offset; i++) {
nums[i][j] = count++;
}
for (; j > starty; j--) {
nums[i][j] = count++;
}
for (; i > startx; i--) {
nums[i][j] = count++;
}
// 第二圈开始
startx++;
starty++;
offset ++;
}
// 如果n为奇数,单独给矩阵最中间的位置赋值
if (n % 2) {
nums[mid][mid] = count;
}
return nums;
}
};
总结
day2打卡,继续加油!