代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数列,59.螺旋矩阵Ⅱ
977.有序数组的平方
双指针法
因为负数平方后也会变大,所以较大的平方值只可能在靠近两端的位置,越往中间走平方值必定越小。
所以,在原数组两端各定义一个指针,慢慢往中间走,然后把平方值按顺序放到新数组里即可。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
int i = 0, j = len - 1, k = len - 1;
vector<int> result(len, 0);
while(i <= j)
{
if(nums[i]*nums[i] < nums[j]*nums[j])
{
result[k] = nums[j]*nums[j];
k--;
j--;
}
else
{
result[k] = nums[i]*nums[i];
k--;
i++;
}
}
return result;
}
};
209.长度最小的子数组
mydemo
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = nums.size();
int sum = 0;
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(nums[j] < nums[j+1])
{
int tmp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = tmp;
}
for(int i=0;i<len;i++)
cout << nums[i] <<" ";
for(int i=0;i<len;i++)
{
sum += nums[i];
if(sum >= target)
return i+1;
}
return 0;
}
};
这个案例没通过:
[12,28,83,4,25,26,25,2,25,25,25,12]
我的输出:7
预期输出:8
错误原因:
找出该数组中满足其总和大于等于
target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。
我这个算法只考虑了最短,没考虑到还需要在原数组中连续
- 滑动窗口法
本质也是双指针,但是这里更巧妙,是动态的双指针。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int subl = 0;
int result = INT32_MAX;
int len = nums.size();
int i = 0;
for(int j=0; j<len; j++)
{
sum += nums[j];
while(sum >= target)
{
subl = j-i+1;
result = result < subl? result : subl;
sum -= nums[i];
i++;
}
}
return result == INT32_MAX? 0 : result;
}
};
- 暴力搜索区间法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int subl = 0;
int result = INT32_MAX;
int len = nums.size();
for(int j=0; j<len; j++)
{
int sum = 0;
for(int i=j; i<len ;i++)
{
sum += nums[i];
if(sum >= target)
{
subl = i-j+1;
result = result < subl? result : subl;
break;
}
}
}
return result == INT32_MAX? 0 : result;
}
};
59. 螺旋矩阵Ⅱ
模拟题,锻炼代码能力。注意边界条件,注意循环不变量。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int count = 1;
int offset = 1;
int startx = 0;
int starty = 0;
int loop = n/2;
int mid = n/2;
int i,j;
while(loop--)
{
i = starty;
j = startx;
for( ; j<n-offset; j++)
res[i][j] = count++;
for(; i<n-offset; i++)
res[i][j] = count++;
for(; j>offset-1; j--)
res[i][j] = count++;
for(; i>offset-1; i--)
res[i][j] = count++;
offset++;
startx++;
starty++;
}
if(n%2 == 1)
res[mid][mid] = count;
return res;
}
};