学习目标:
- 977. 有序数组的平方
- 209. 长度最小的子数组
- 59. 螺旋矩阵II
学习内容:
977. 有序数组的平方
//方法1
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0 ; i <= nums.size() - 1 ; i++){
nums[i] = nums[i] * nums[i];
}
// 排序
sort(nums.begin(), nums.end()); // 快速排序
return nums;
}
};
排序算法温故
待补充。
class Solution {
public:
//方法2
int k = nums.size()-1; //定义一个指针从数组最后一个位置放最大值
vector<int> result(nums.size(),0); //注意新建数组的写法
for(int i = 0, j = nums.size()-1 ; 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. 长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//暴力法,18/21 cases passed (N/A)
int k = INT32_MAX;
for(int begin = 0; begin < nums.size();begin++)
{
int sum = 0;
for(int end = begin; end < nums.size();end++)
{
sum+=nums[end];
if(sum>=target)
{
k=min(k,end-begin+1);
break;
}
}
}
return k==INT32_MAX ? 0 : k;
}
};
错误以及注意事项
- 暴力破解超时了考虑滑动窗口。
// 滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX; //先设定为最大,然后找到后替换。
int sum = 0;
int sublength = 0;
int i = 0;
for(int j = 0;j<nums.size();j++)
{
sum = sum+nums[j];
while(sum>=target){
sublength = j-i+1;
if(sublength<result)
{
result = sublength;
}
sum = sum - nums[i];
i++;
}
}
if(result == INT32_MAX){
return 0;
}
else{
return result;
}
}
};
错误以及注意事项
- 滑动窗口的思想还是要多练一段时间。
59.螺旋矩阵II
方法一用的方法是labuladong的四个限制条件的方法,如下图所示,不断更新四个边界的值。
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
int upperbound = 0;
int lowerbound = n - 1;
int leftbound = 0;
int rightbound = n - 1;
vector<vector<int>> matrix(n, vector<int>(n, 0));
int value = 1;
while (value <= n * n)
{
if (upperbound <= lowerbound)
{
// 在顶部从左向右遍历
for (int j = leftbound; j <= rightbound; j++)
{
matrix[upperbound][j] = value++;
}
upperbound++;
}
if (leftbound <= rightbound)
{
// 在右边从上往下遍历
for (int i = upperbound; i <= lowerbound; i++)
{
matrix[i][rightbound] = value++;
}
rightbound--;
}
if (upperbound <= lowerbound)
{
// 在下面从右往左遍历
for (int j = rightbound; j >= leftbound; j--)
{
matrix[lowerbound][j] = value++;
}
lowerbound--;
}
if (leftbound <= rightbound)
{
// 在左边从下往上遍历
for (int i = lowerbound; i >= upperbound; i--)
{
matrix[i][leftbound] = value++;
}
leftbound++;
}
}
return matrix;
}
};
错误以及注意事项
- 边界是变量,变化的话,外面一定要括一个大的if来判断是否还能继续走里面的内容。可以加快脑子思考的方式是,代码中哪个变量发生变化了,上面的if就放什么判断条件,比如下面是
upperbound++
了,那么上面的if条件就是与upperbound相关的,不会是left/right。
if (upperbound <= lowerbound)
{
// 在顶部从左向右遍历
for (int j = leftbound; j <= rightbound; j++)
{
matrix[upperbound][j] = value++;
}
upperbound++;
}
方法二是代码随想录中的方法,待补充。
学习时间:
2023.12.8 21:30-22:38
这一期的60天打开是从11.29开始的,算下来60天后是1.27正好是我放寒假的时间,还听巧妙。现在在补的这几天的打卡是因为上周周末回家了。希望剩下的时间里少干一点这种玩儿去了不打卡的行为——会造成我22:30了还在这里补打卡:(