977 有序数组的平方
用到了双指针,
注意i == j的时候,对应的元素是同一个,不能漏掉
这个题目是第二次做,还是比较熟悉的
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//要熟悉vector定义的方法
//定义一个列为num.size()的长度,行为0的数组
vector<int> result(nums.size(), 0);
//i从最左边,j从最右边,k是指示下标
int i, j, k = nums.size() - 1;
for(i = 0, j = nums.size() - 1; 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;
}
};
209 长度最小的子数组
这个题目的循环形式,判断条件,循环内容,还是有点刁钻的,不容易想到
滑动窗口,相当于也是双指针
此类题目第一次做,看视频勉强看懂了,但是自己写还是有问题,技巧性很强
//暴力解法,两个for循环,所有可能都遍历出来,找到大于等于s的,再选出长度最小的
//滑动窗口,双指针的思想,取两个指针中间的集合,所以更像是一个窗口
//就是用一个for循环,做两个for循环所做的事情
//j如果表示起始位置,那么终止位置依然要全部遍历,和暴力解法类似
//j应该指向终止位置
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int subL = 0;
int result = INT32_MAX;
int sum = 0, i = 0;
for(int j = 0; j < nums.size(); j++) {//终止位置向后移动
sum += nums[j];//收集元素的和
while(sum >= target) {//i持续向后移动的过程,用while,判断的是上一轮的结果
subL = j - i + 1;//记录每一个符合条件的subL
result = min(result, subL);//记录一个结果,因为有while的判断在,这个结果一定是符合的
sum = sum - nums[i];//默认i向后开始移动一个,直接做操作,结果放在while里判断
i++;
//逐个向后面移动i,在while循环中可以做多次
//大概意思是,j向后的过程中,可能遇到比较大的值
//只要sun还是大于s的,就可以i尝试向前移,有可能可以节省下一些距离
//一旦sum小于s了,j又开始尝试向后移
//是一个反复拉扯的过程,尽量使得j不要后移,尽量使得i前移,这样缩小窗口长度
}
}
return result == INT32_MAX ? 0 : result;
}
};
59 螺旋矩阵 II
这个题目第二次做了 思路很简单其实 看似复杂
循环不变量
边界条件,左闭右开
分类四个方向分别进行处理
边界细节可以用具体参数代入手写模拟
对于vector二维数组的定义不太熟练
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> nums(n, vector<int>(n, 0));//初始化定义二维数组的方法
int startx = 0, starty = 0, i, j;
int offset = 1;
int count = 1;
int loop = n/2;
while(loop--) {//n是偶数,转n/2圈。n是奇数,转n/2加中间的数字
//横向从左向右
for (j = starty; j < n - offset; j++) {
//填充元素
nums[startx][j] = count++;
}
//纵向从上向下
for (i = startx; i < n - offset; i++) {
nums[i][j] = count++;
}
//横向从右向左
for (j; j > starty; j--) {
nums[i][j] = count++;
}
//纵向从下向上
for (i; i > startx; i--) {
nums[i][j] = count++;
}
offset++;
startx++;
starty++;
//loop--;
}
if(n % 2 == 1) {
nums[n/2][n/2] = n*n;
}
return nums;
}
};