977.有序数组的平方(题目链接:力扣)
思路:看到题目描述要时间复杂度为O(n)基本知道又是一道双指针做法的题了,先把原数组每个元素求平方,左右两边各一个指针,每次取较大的值赋值给新数组(新数组采用头插法),唯一要注意的就是用vector定义数组并赋值的方法,只有定义了数组大小才能用索引的方式来遍历,否则用push_back就只能尾插法,此题不适用。
vector<int> sortedSquares(vector<int> &nums)
{
vector<int> newNums(nums.size(), 0);
int k = nums.size() - 1;
int leftIndex = 0;
int rightIndex = nums.size() - 1;
for (int i = 0; i < nums.size(); i++)
{
nums[i] = nums[i] * nums[i];
}
while (leftIndex <= rightIndex)
{
if (nums[leftIndex] > nums[rightIndex])
{
newNums[k--] = nums[leftIndex++];
}
else
{
newNums[k--] = nums[rightIndex--];
}
}
return newNums;
}
977.有序数组的平方(题目链接:力扣)
思路:时间复杂度要求O(n),基本确定用双指针的做法,也可以看作是滑动窗口,前指针每次向前移动一格,后指针根据判断是否缩小窗口(把最后一个元素丢掉),每次把窗口的size作比较,找到最小的一次窗口大小。
int minSubArrayLen(int target, vector<int>& nums) {
int num = 0;
int len=INT32_MAX;
int i = 0;
int j = 0;
while(j < nums.size()){
num += nums[j++];
if(num >= target){
while(num - nums[i] >= target){
num -= nums[i++];
}
if(j - i < len){
len = j - i;
}
}
}
return len == INT32_MAX ? 0 : len;
}
59.螺旋矩阵II(题目链接:力扣)
思路:思来想去没有小于时间复杂度O(n^2)的方法,即使能够推导出每行赋值的数学公式,遍历赋值也需要n^2次,所以就按照题意绕圈赋值,每次赋值可以看作四个子过程,从左往右,坐上往下,从右往左,从下往上,要注意边界的循环不变量原则,按照固定的区间(每次都是左闭右开等),题目没难度,就是要注意代码编写的严谨程度,需要很细心。
vector<vector<int>> generateMatrix(int n)
{
int i = 0;
int j = 0;
int count = 1;
vector<vector<int>> nums(n, vector<int>(n, 0));
while (count <= n * n)
{
while (j <= n - i - 1)
{
nums[i][j++] = count++;
}
j--;
i++;
while (i <= j)
{
nums[i++][j] = count++;
}
i--;
j--;
while (j >= n - i - 1)
{
nums[i][j--] = count++;
}
j++;
i--;
while (i > j)
{
nums[i--][j] = count++;
}
i++;
j++;
}
return nums;
}