977. 有序数组的平方
[思路]: 首尾双指针。首尾元素比较绝对值大小,把平方大的放入res[k]。

vector<int> sortedSquares(vector<int>& nums) {
vector<int> res (nums.size(),0);
int k = nums.size()-1;
for(int i=0, j=nums.size()-1; i<=j;)
{
if(abs(nums[i]) > abs(nums[j]))
{
res[k--] = nums[i]*nums[i];
i++;
}
else{
res[k--] = nums[j]*nums[j];
j--;
}
}
return res;
}
209. 长度最小的子数组
[思路:] 快慢双指针,模拟滑动窗口。

int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0; // i-j窗口内数值之和
int i = 0; // 窗口左边界
int subLength = 0; // 窗口长度
for (int j = 0; j < nums.size(); j++) {//移动有边界,直到窗口内总和大于等于target
sum += nums[j];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子数组是否符合条件。当不符合条件时才需要移动右边加j以扩大窗口
while (sum >= target) {
subLength = (j - i + 1); // 取子数组的长度
result = result < subLength ? result : subLength;//更新result
i++;//移动左边界
sum -= nums[i]; //移除窗口外的元素
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
59. 螺旋矩阵Ⅱ
按如下顺序填充一圈。圈数
round=n/2. 例外每一圈开始的位置用start_i和start_j表示。每填充完一圈,下一圈的起始位置等于start_i++, start_j++.
注意n为奇数时,这样的循环不会填充后一层的,即res[n/2][n/2],因为它只有一个元素。所以最后额外添加就好。

vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector(n,0));
int round = n/2;
int start_i =0, start_j=0;
int num=1;
while(start_i<round)
{
int j =start_j, i=start_i;
for(; j<n-1-start_i; j++)
{
res[i][j] = num++;
}
for(; i<n-1-start_j; i++)
{
res[i][j] = num++;
}
for(;j>start_j; j--)
{
res[i][j] = num++;
}
for(;i>start_i; i--)
{
res[i][j] = num++;
}
start_i++;
start_j++;
}
if(n%2==1) res[n/2][n/2]=num;
return res;
}
本文介绍了两种数组操作的算法:一种是给定一个整数数组,返回其所有元素平方后的有序数组;另一种是在给定数组中找到和大于等于目标值的最小子数组长度。这两种方法都采用了双指针技术。此外,还讨论了生成螺旋矩阵的算法,通过循环填充实现矩阵的螺旋排列。

528

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



