有序数组的平方,双指针新数组、长度最小的子数组 双指针、螺旋矩阵II
文章目录
有序数组的平方,双指针新数组
Problem: 977. 有序数组的平方
思路
双指针,一个指针指向头一个指针指向尾,然后同时向中间遍历。同时平方然后比大小。依次将大的从后往前插入新的数组,即可。
解题方法
要考虑的点,多会儿停止:
最简单的方法,直接循环0~
N-1也就是N次,N为nums.size()。
carl的方法,while(i <= j),他在这里讲了一下,为什么是 <=,因为i = j,这个情况是需要进行判断考虑的,所以需要加=号,如果不加=号,那么i=j这个不应该出现在这个判断循环中,换句话说就是不合法。
从二分到现在,理解了一点,遍历的这个条件,其实也就是合法条件。只要是合法的就得放进去,不合法的退出。
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
Code
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
const int N = nums.size();
vector<int> arr(N, 0);int a = 0,b = N-1;
for(int i = N-1;i >= 0;i--)
{
if((nums[a] * nums[a]) > (nums[b] * nums[b]))
{
arr[i] = nums[a] * nums[a];
a++;
}
else
{
arr[i] = nums[b] * nums[b];
b--;
}
}
return arr;
}
};
长度最小的子数组 双指针
Problem: 209. 长度最小的子数组
思路
同样是双指针问题,但是这个又叫做滑动窗口问题。思路很好理解,也就是有一个快指针和一个慢指针,快指针时刻要保证包含的数组元素之和大于target,然后去移动慢指针,慢指针以移动,快指针就去移动到下一次元素之和大于target的地方,直到快指针移到最后一个。这里才是容易被遗忘的点:如果不进行别的操作的话,慢指针会认为快指针始终能移到满足的位置,但是快指针已经到了数组末尾了,所以这里需要追加判断,如果元素之和还成立的话,才会重新取slow和fast之间的元素个数的最小值,如果不等于那就不取了。
解题方法
一般我的解题方法均是我在写代码时的错误问题:
首先,边界问题:数组里面边界问题是一个很奇怪的问题,需要一定的总结:
如果你要放的是一个长度为N的数组,(元素个数为N)
那么实际上你的下标是0~
N-1
这里就要知道for循环中,for(int i = 0;i < N;i++),它会遍历0~
N-1,这个里面是不会越界的,因为当i最后++到N的时候,就不会进循环了,所以会将0~
N-1的数全正常的用。
还有一个就是左闭右闭和左闭右开,需要判定这个题需不需要看这两个条件。
如果需要看的话,那么这个就是循环不变量。根据这个来判定<还是<=。
复杂度
- 时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
Code
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int slow = 0,fast = 0;
int result = INT32_MAX;int sum = 0;
while(slow < nums.size())
{
if(sum < target && fast < nums.size())
{
sum += nums[fast];
fast++;
continue;
}
if(sum >= target)
{
if((fast - slow) < result)
{
result = fast - slow;
}
}
sum -= nums[slow];
slow++;
}
if(result == INT32_MAX) return 0;
return result;
}
};
螺旋矩阵II
Problem: 59. 螺旋矩阵 II
思路
螺旋矩阵已经写过好多回了,但是这回给我很大的启发。其实就是每次动的要一样,就是要右边留一个就都留一个,遵循循环不变式。
解题方法
这个题的问题,就是我在for循环里面,要int i就都int,要在while里int,for里面就别int。
Code
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> array(n, vector<int>(n, 0));
int offset = 1;
int loop = n/2;
int study = 0;
int studx = 0;
int count = 1;int mid = n / 2;
int i = 0;int j = 0;
while(loop--)
{
for(j = study;j < n-offset;j++)
{
array[studx][j] = count++;
}
for(i = studx;i < n-offset;i++)
{
array[i][n-offset] = count++;
}
for(;j > study;j--)
{
array[n-offset][j] = count++;
}
for(;i > studx;i--)
{
array[i][study] = count++;
}
offset++;
studx++;
study++;
}
if((n % 2) != 0)
{
array[studx][study] = count;
}
return array;
}
};
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> array(n, vector<int>(n, 0));
int offset = 1;
int loop = n/2;
int study = 0;
int studx = 0;
int count = 1;int mid = n / 2;
int i = 0;int j = 0;
while(loop--)
{
for(int j = study;j < n-offset;j++)
{
array[studx][j] = count++;
}
for(int i = studx;i < n-offset;i++)
{
array[i][n-offset] = count++;
}
for(int j = n-offset;j > study;j--)
{
array[n-offset][j] = count++;
}
for(int i = n-offset;i > studx;i--)
{
array[i][study] = count++;
}
offset++;
studx++;
study++;
}
if((n % 2) != 0)
{
array[studx][study] = count;
}
return array;
}
};