解题思路:双指针法,前后并行
// 双指针
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
int i = nums.size() - 1;
vector<int> result(nums.size(), 0);
while(left <= right) {
int left_value = nums[left] * nums[left];
int right_value = nums[right] * nums[right];
if (left_value > right_value) {
result[i--] = left_value;
left++;
} else {
result[i--] = right_value;
right--;
}
}
return result;
}
解题思路:滑动窗口
// 滑动窗口
int minSubArrayLen(int target, vector<int>& nums) {
int result = __INT32_MAX__;
int i = 0; // 窗口起始位置
int sum = 0; // 窗口值
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
while (sum >= target) {
int sublen = j - i + 1;
result = sublen < result ? sublen : result;
sum -= nums[i++];
}
}
return result == __INT32_MAX__? 0 : result;
}
解题思路:考虑好所有的边界条件,例如圈数、左右区间、偏移量
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0, starty = 0; // 起始位置
int loop = n / 2; // 循环圈数
int mid = n / 2; // 如果n为奇数,用于索引矩阵中心点
int count = 1; // 用于矩阵赋值
int offset = 1; // 每一圈区间右侧的偏移量
while (loop--) {
int i = startx;
int j = starty;
for (j = starty; j < n - offset; j++) {
res[startx][j] = count++;
}
for (i = startx; i < n - offset; i++) {
res[i][j] = count++;
}
for (; j > starty; j--) {
res[i][j] = count++;
}
for (; i > startx; i--) {
res[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if (n % 2 != 0) {
res[mid][mid] = count;
}
return res;
}
数组专项总结
- 双指针
- 滑动窗口
- 查找
- 二分查找