代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II。
今天做了三道题,用时一个半小时。晚上再找几道题补充一下。
977.有序数组的平方
题目链接:977.有序数组的平方
文章讲解
状态:知道要用双指针,但是没想到要在开一个数组,想到之后就ac出来了。
思路:有序数组,最大值一定在两侧,用双指针,再开一个数组储存。用while循环。
代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
for (int i = 0; i < size; i++)
nums[i] *= nums[i];
vector<int> result(nums.size(),0);
int j = size - 1;
int k = size - 1;
int i = 0;
while (k >= 0)
{
if (nums[j] > nums[i])
{
result[k--] = nums[j];
j--;
}
else
{
result[k--] = nums[i];
i++;
}
}
return result;
}
};
209.长度最小的子数组
题目链接:209.长度最小的子数组
文章链接
状态:能明白滑动窗口的思想,但是用代码实现不出来
思想:画图画出来了,有时候一动笔就能想出来,用了一个while循环。以后多试试三目运算符。
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int size = 0;
int i = 0;
int result = INT_MAX;
int sum = 0;
for (int j = 0; j < nums.size(); j++)
{
sum += nums[j];
while (sum >= target)
{
size = j - i + 1;
result = min(size,result);
sum -= nums[i++];
}
}
return min(result,size);
}
};
59.螺旋矩阵II
题目链接:59.螺旋矩阵II
文章链接
状态:磕磕绊绊的能ac出来,用的时间有点长。
思路:首先要了解螺旋矩阵的性质,在填充时每一行要留出一位给下一位,所以要设置offset。loop来控制循环的圈数,还要注意奇数时中间位置数的填充,在转圈是要注意边界条件,不要越界。最后一圈过后起始坐标都要加一。
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int startX = 0;
int startY = 0;
int count = 1;
int mid = n / 2;
int i,j;
int loop = n / 2;
int offset = 1;
vector<vector<int>> res(n, vector<int>(n, 0));
while (loop--)
{
for (i = startY; i < n - offset; i++) res[startX][i] = count++;
for (j = startX; j < n - offset; j++) res[j][i] = count++;
for (;i > startY;i--) res[j][i] = count++;
for (;j > startX;j--) res[j][i] = count++;
startX++;
startY++;
offset += 1;
}
if (n % 2) res[mid][mid] = count;
return res;
}
};
数的三次方根
思路:用二分法直接做,注意保留6位小数,根据经验应该循环到八位小数,替换区间边界时不用加一。
代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double x;
cin>>x;
double l = -10000;
double r = 10000;
while (r - l > 1e-8)
{
double mid = (l + r) / 2;
if (mid * mid * mid >= x) r = mid;
else l = mid;
}
printf("%lf",l);
return 0;
}