Day2打卡! 时长:3.5h
今日感想:通过这三道题,不仅对每个题涉及的思路有所学习(双指针、滑动窗口、循环不变量),同时每道题代码中涉及到的小小细节也得到了学习,非常不错👍!
Leetcode 977 有序数组的平方
题目链接:977 有序数组的平方
第一想法:这道题分为两个部分,先将数组里每一个数求平方计算,再将结果数组升序排序,此等暴力破解是可以解题的。但在题目建议里提示了“双指针思想”,那肯定最优解就是这么个思路。
讲解后想法:我是真的天真!通过卡哥讲解才搞明白题目中的“非递减顺序”是啥意思,即“递增,但并非单调,因为可能有重复值”。理解了这个,才算真的理解双指针思想的内涵。
遇到的困难:还是花了一点时间去理解Java的方法,有所收获。
代码:双指针版
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while(left <= right){
if(nums[left] * nums[left] > nums[right] * nums[right]){
result[index--] = nums[left] * nums[left];
++left;
}else{
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
}
}
Leetcode 209 长度最小的子数组
题目链接:209 长度最小的子数组
第一想法:这道题首先是数组中从某个下标开始求和计算并与目标值进行比较的操作。其次,还要在满足条件的子数组中取长度最小的。感觉要创建一个新的数组,在计算操作的同时保存长度,如果遇到长度更小的,就把他替换掉。不知道这个思路对不对?
讲解后想法:新get了一个“滑动窗口”的思想,卡哥的讲解很清晰明了,但在实际操作的时候还是短暂的犯了一下迷糊。
遇到的困难:关键点在于搞清楚窗口内的内容是什么,以及如何巧妙地移动起始点和结束点。
代码:滑动窗口版
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int right = 0; right < nums.length; right++){
sum += nums[right];
while(sum >= target){
result = Math.min(result , right - left +1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
Leetcode 59 螺旋矩阵||
题目链接:59 螺旋矩阵||
第一想法:拿到正整数n之后应该有几件事要做:先计算出n*n的结果,然后是什么......而且Java中关于矩阵的知识我也不太记得了......
讲解后想法:我的思路就是一整个大混乱......怎么说,这道题其实还是整明白“循环不变量”的活。要搞清楚处理的区间边界,才能在每条边遍历的时候不糊涂。
遇到的困难:这道题刚拿到手还是觉得很复杂的,理解起来有点费劲,直到听完讲解看完代码才不这么糊涂。后面要着重复习一下!
代码:理解好循环不变量!
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] res = new int[n][n];
int start = 0;
int count = 1;
int i, j;
while(loop++ < n / 2){
for(j = start; j < n - loop; j++){
res[start][j] = count++;
}
for(i = start; i < n - loop; i++){
res[i][j] = count++;
}
for(; j >= loop; j--){
res[i][j] = count++;
}
for(; i >= loop; i--){
res[i][j] = count++;
}
start++;
}
if(n % 2 == 1){
res[start][start] = count;
}
return res;
}
}