思路:第一次见到题目并没有思路,思考十来分钟后依然没思路,选了答案。
实现过程:使用四个for循环来给四条边依次进行赋值,需要另外设置变量来控制每一圈开始的地方,以及其中需要注意边界条件的处理,这是比较关键的地方,思考不清楚可能会陷入进去。
结论:需要二刷。
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int loop = n / 2;
int mid = n / 2;
int startx = 0;
int starty = 0;
int offset = 1;
int i,j;
int count = 1;
vector<vector<int>> res(n, vector<int>(n, 0));
while(loop)
{
i = startx;
j = starty;
for(j = starty;j < n - offset;j++)
res[startx][j] = count++;
for(i = startx; i < n - offset;i++)
res[i][j] = count++;
for(;j > starty;j--)
res[i][j] = count++;
for(;i > startx;i--)
res[i][j] = count++;
startx++;
starty++;
offset++;
loop--;
}
if(n % 2 != 0)
res[mid][mid] = n * n;
return res;
}
};
思路:遍历容器,进行平方重新赋值,使用容器自带排序算法完成
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(auto &i:nums)
i = i * i;
sort(nums.begin(),nums.end());
return nums;
}
};
思路:一开始的想法是暴力法,接着思考了有没有其他的方法,想法是可以先把里面的最大值找出来,再以最大值为中心寻找两边的数,直到符合题意,结果就是这其中会遗漏许多的情况并没有完全考虑好以失败告终
实现过程:看完答案才知道用滑动窗口的方式进行解决,利用好双指针来控制遍历的起点和终点,再在其中进行条件的判断,先找到最开始就符合题意的区间,接着再慢慢缩小,最后找到最小的。
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0;
for(int j = 0;j < nums.size();j++)
{
sum += nums[j];
while(sum >= target)
{
int subL = j - i + 1;
result = min(subL,result);
sum -= nums[i];
i++;
}
}
return result == INT32_MAX?0:result;
}
};