总体感受:相较第一天,总体思路还是有所清晰的,会主动思考如何运用暴力解法梳理整个题目的思路,同时考虑是否能够运用昨天了解到的“双指针”的方法。接下来对今天的基本题目进行总结:
977.有序数组的平方
题目链接:有序数组的平方
思路:
1.由于负数的平方是正数,因此数组顺序不能沿用原来的,同时为了避免数组覆盖,应该创建一个新的数组并对其进行排序;
2.为了比较左边(倾向为负数)和右边(倾向为正数)平方后的大小,“双指针”应该从两侧向中间移动,而不是类似于快慢指针一样,从单侧移动,然后先存储大的元素;
3.考虑循环中的“=”问题,可以调试的时候检查一下。
ps:暴力解法:先平方,后排序。
int left = 0;
int right = nums.size() - 1;
int i = nums.size() - 1;
while(left <= right) {
if(nums[left] * nums[left] <= nums[right] * nums[right]) {
result[i--] = nums[right] * nums[right];
right--;
// i--;
} else{
result[i--] = nums[left] * nums[left];
left++;
// i--;
}
}
return result;
209.长度最小的子数组
题目链接:长度最小的子数组
思路:
1.这是就需要快慢指针从一端滑动过去,并加和寻找满足数组和≥目标数据的长度最小子函数;
2.涉及到循环条件的设计,即怎样进行后续的处理:先找到满足条件的;再从满足条件之中剔除,找到最小的;
3.简洁代码的一种方式:三目运算符。
ps:暴力解法:双重for循环,去寻找满足条件的子序列。
int slow = 0;
int sum = 0;
int len = 0;
int result = INT32_MAX;
for(int fast = 0; fast < nums.size(); fast++) {
sum += nums[fast];
while(sum >= target) {
len = fast - slow + 1;
result = result < len ? result: len;
sum -= nums[slow++];
}
}
return result = result == INT32_MAX ? 0: result;
59.螺旋矩阵Ⅱ
题目链接:螺旋矩阵Ⅱ
思路:
1.由于要回转着对1-n^2进行排列,就要考虑对这四个"边边"怎样进行处理: ①每个边(x,y)坐标中至少有一个不变的,可以用for循环来移动; ②保证每条边在使用循环时的次数是一样的(n = 4,为16个元素,如图所示),因此要对其去的范围进行限制,即左闭右开
2.考虑要旋转几圈: ①奇数命令时,最内侧只有一个数组,而偶数命令时,最内侧是一个方块; ②圈数影响总体循环个数,即构建这四条边的次数
3.各种辅助细节的考虑:每完成一次循环,x y 的初始位置都要进行+1操作,而右侧(尽头)进行-1操作,即两侧变窄.
vector<vector<int>> result = vector(n, vector<int>(n , 0));
int x = 0;
int y = 0;
int startx = 0;
int starty = 0;
int num = n / 2;//获得循环的圈数
int count = 1;
if(n % 2 == 1) //n为奇数
result[num][num] = n * n;
while(num--) {
x = startx;
y = starty;
for( ; y < n - starty -1; y++) {
result[x][y] = count++;
}
for( ; x < n - startx -1; x++) {
result[x][y] = count++;
}
for( ; y > 0 + starty; y--) {
result[x][y] = count++;
}
for( ;x > 0 + startx; x--) {
result[x][y] = count++;
}
startx++;
starty++;
}
return result;