今日巩固学习:双指针的灵活应用,滑动窗口,边界条件
双指针的灵活应用
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
vector<int> result;
while(l <= r){
if(nums[l] * nums[l] > nums[r] * nums[r]) result.push_back(nums[l] * nums[l++]);
else if(nums[l] * nums[l] <= nums[r] * nums[r]) result.push_back(nums[r] * nums[r--]);
}
l = 0, r = nums.size() - 1;
while(l < r){
swap(result[l++], result[r--]);
}
return result;
}
};
关键在于维护有序的数组,使用双指针保证高效(不重复)且不漏的遍历所有变量
滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int start = 0, end = 0, n = nums.size(), ans = 100001, sum = 0;
while(end < n){
sum += nums[end];
while(sum >= target){
ans = min(ans, end - start + 1);
sum -= nums[start++];
}
end++;
}
return ans == 100001 ? 0 : ans;
}
};
滑动窗口是双指针的一种表现形式,关键在于找到前后区间,要注意区间满足的条件,条件满足后固定一侧来移动另一侧,实现“夹逼”。
边界条件
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> dir{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
vector<vector<int>> res(n, vector<int>(n, 0));
int row = 0, col = 0, recent = 0, d = 0;
while(true){
recent++;
res[row][col] += recent;
int nextRow = row + dir[d % 4][0], nextCol = col + dir[d % 4][1];
if(nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || res[nextRow][nextCol] != 0){
d++;
row = row + dir[d % 4][0], col = col + dir[d % 4][1];
}else{
row =nextRow;
col = nextCol;
}
if(recent >= n * n){
break;
}
}
return res;
}
};
在涉及访问多维矩阵时,要充分考虑边界条件,要多想,多做极端假设。

被折叠的 条评论
为什么被折叠?



