前言
LeetCode题目:977、209、59
Takeaway:双指针、滑动区间、代码基本功
一、LeetCode 977
左右双指针向中间移动,之后反转vector。不反转的话其实可以装填的时候就反向装填,提前定义一个num = size,然后每次size–
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
vector<int> result;
while(left <= right){
if(nums[left]*nums[left] >= nums[right]*nums[right]){
result.push_back(nums[left]*nums[left]);
left++;
}else{
result.push_back(nums[right]*nums[right]);
right--;
}
}
reverse(result.begin(),result.end());
return result;
}
};
二、LeetCode 209
本题考验滑动区间,用一层循环代表靠后的指针,靠前的指针在每一次循环内前移。
我自己遇到的问题是解决思路出现问题,其实只有sum不够大的情况靠后的指针才会移动,所以不存在靠后的指针还要往回移动的情况。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int p_latter = 0;
int sum = 0;
int length = 99999999;
for(int p_former=0; p_former<nums.size(); p_former++){
sum += nums[p_former];
/* 这里要用 >= 而不是 >,这是因为当 sum恰好等于target时,length也需要更新 */
while(sum >= target){
if((p_former-p_latter) < length){
length = p_former-p_latter+1;
}
sum -= nums[p_latter];
p_latter++;
}
}
/* 长度没变化,说明不存在满足条件的窗口 */
if(length == 99999999){
length = 0;
}
return length;
}
};
三、LeetCode 59
纯考验代码基本功的一道题,全程没有什么算法,只是要考虑各种特殊的情况。比如奇偶(最里面的一圈),边界处理。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int length = n-1;
/* 0:right,1:down,2:left,3:up */
int direction = 0;
/* position */
int x=0;
int y=0;
/* 每4个turn,length要减一 */
int turn = 0;
int total = n*n;
/* 奇偶: 0偶 1奇 */
int type = n%2;
for(int num=1; num<=total; ){
if(turn == 4){
length -= 2;
turn = 0;
}
if(length == 0){
res[y][x] = num;
break;
}
turn++;
/* go right */
if(direction == 0){
for(int i=0; i<length; i++){
res[y][x] = num;
num++;
x++;
}
}
/* go down */
if(direction == 0){
for(int i=0; i<length; i++){
res[y][x] = num;
num++;
y++;
}
}
/* go left */
if(direction == 0){
for(int i=0; i<length; i++){
res[y][x] = num;
num++;
x--;
}
}
/* go up */
if(direction == 0){
for(int i=0; i<length; i++){
res[y][x] = num;
num++;
y--;
}
y++;
x++;
}
direction = (direction+1)%4;
}
return res;
}
};
总结
今天题目还比较简单,除了滑动区间的题,其余都是独立一次过。
209滑动区间注意滑动的指针应该象征着结尾的指针。
59纯考验代码基本功,没什么好总结的。