977.有序数组的平方
看到这个题目,首先想到的是先把数组里的数字挨个平方再排序完事,第一时间写出的代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i < n;i++)
{
nums[i] = nums[i] * nums[i];
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n-1;j++)
{
if(nums[j] > nums[j+1])
{
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
};
我傻了,用的冒泡排序,超出时间限制了,其实一个sort排序函数就完事了,把冒泡排序换成
sort(nums.begin(), nums.end());
改了以后,就通过了,没有超出时间限制,但显然不是最优解。因为最初的数组也是按照顺序排列的,因为平方之后大小顺序才发生改变,所以可以考虑采用双指针法:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> result(n, 0);
int i = 0,j = n-1,k = n-1;
while(i <= j) //注意,这里要i <= j,因为最后要处理两个元素。我开始写的是i!=j,会报错。
{
if(nums[i] * nums[i] < nums[j] * nums[j])
{
result[k--] = nums[j] * nums[j];
j--;
}
else
{
result[k--] = nums[i] * nums[i];
i++;
}
}
return result;
}
};
注意:while里的条件不能写i!=j,这里要i <= j,因为最后要处理两个元素!!!
209.长度最小的子数组
这道题首先我考虑的是用快慢指针解决,具体思路如下:指定一个快慢指针指向数组起点,count值为累计的总值,当总值小于target,快指针向右移动,同时设定一个值计算count里包含到了几个数组值。当count值等于大于target时,slow指针向右挪动,直到count重新小于target。fast指针继续向右边移动,重复以上规律直到到达数组尾部。想法很丰满,实现起来bug一堆> _ <,菜果然是原罪,不过我还是艰难的尝试了,代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX;
int count = 0;
int slow = 0;
int subLength = 0;
for (int fast = 0; fast < nums.size(); fast++) {
count += nums[fast];
while (count >= s) {
subLength = (fast - slow + 1);
result = result < subLength ? result : subLength;
count -= nums[slow++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
59.螺旋矩阵II
这是一道中等题,题目的描述看起来很简单,但是实操起来被各种边界条件弄得模模糊糊,看了视频解说之后,自己写了一遍:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector(n,0));
int num = 1; //要填入数组的数字
int loop = n/2;//循环的次数
int startx = 0,starty = 0;//起始的位置
int mid = n/2;//矩阵中间的位置
int offset = 1;//每次循环以后圈子在缩小,需要设置一个值来收缩范围
int i,j;
while(loop --)
{
i = startx;
j = starty;
for(j = starty; j < n - offset; j++)
{
res[startx][j] = num++;
}
for(i = startx;i < n - offset; i++)
{
res[i][j] = num++;
}
for(; j > starty; j--)
{
res[i][j] = num++;
}
for(; i > startx; i--)
{
res[i][j] = num++;
}
startx++;
starty++;
offset++;
}
if (n % 2)
{
res[mid][mid] = num;
}
return res;
}
};
做的磕磕绊绊,感觉需要再重复做几遍~
今天的三道题打卡完毕!~撒花~