1. 有序数组的平方
977. 有序数组的平方
-
第一想法:暴力破解
-
看完题解想法:朝着双指针方向想
-
遇到困难:
-
用双指针的话,一开始想到两边指针往中间靠,逐个将最大值赋给结果数组。和题解不同的是,循环条件我写了 while (left != right) {...},相比于题解的 while (left <= right) {...},我需要在后面单独为第一个元素赋值(因为没有cover到最后一个元素就跳出循环了)
-
判断条件中,对于nums[left] == nums[right]这种情况,一开始的想法是两头同时逼近与赋值。但是在最后两个元素相同时,此想法报错(例如:[-1, 0, 0, 2])。因此左右指针相等时,可以将其归到两边指针中的一边执行。
-
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
nums[i] *= nums[i];
}
int left = 0;
int right = nums.length - 1;
int curr = right;
// 一开始写了while (left != right) {...},就需要最后手动赋值
while (left <= right) {
if (nums[left] >= nums[right]) {
res[curr] = nums[left];
left++;
} else if (nums[left] < nums[right]) {
res[curr] = nums[right];
right--;
}
curr--;
}
// 最后一个元素时需要手动赋值
// res[0] = nums[left];
return res;
}
-
时长与收获:
-
双指针循环条件需要cover到边界
-
左右两边元素相等时,可以选择一遍执行
-
时长:30min
-
2. 长度最小的子数组
209. 长度最小的子数组
-
第一想法:可以想到双指针
-
看完题解想法:和题解想法差不多,主要差别在:计算数组元素个数语句count = Math.min()的位置不同。官方题解把该语句在while (sum >= target)循环内,意思是计算每一步sum >= target的最小值;而我放在了循环外,再+1
-
遇到困难:
-
每次循环内代码的执行顺序不是很明确(例如什么时候指针移动,什么时候累加)。
-
最后忘记将Integer.MAX_VALUE转成了0
-
-
时长与总结:
-
右指针的移动伴随着总数的累加,因此累加操作要在每个循环的开头文章来源:https://www.toymoban.com/news/detail-411163.html
-
时长:40min文章来源地址https://www.toymoban.com/news/detail-411163.html
-
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int count = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sum < target) continue;
// 1.1 取到sum < target长度最大时跳出循环
while (sum >= target) {
sum -= nums[left];
left++;
}
// 1.2 这里需要额外+1,意思是把 sum < target最大长度 变成 sum >= target最小长度
count = Math.min(count, i - left + 1 + 1);
}
// 2.1 不存在符合条件的数组时,返回0
return count == Integer.MAX_VALUE? 0 : count;
}
3. 螺旋矩阵II
到了这里,关于算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!