LeetCode 977 有序数组的平方
题目链接:977.有序数组的平方
看到题目提示,双指针。哎这个我昨天学过,从两边开始呗,只需要把负数平方,和后边比插入前边。于是动手开始在本子上写着模拟过程,但是每次比完还得移动大量的改变之后的位置。实在想不出来感觉自己还是太菜了!
然后,去看代码随想录这一题的思路,哎竟然再加一个数组就好了,我天加一个数组能省这么多步骤。我怎么没这么想过,这个好强哈。看完之后写出下边代码。一次过哈哈哈哈。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] T = new int [nums.length]; //初始化一个临时数组存放结果
int t = nums.length - 1;
int leftIndex = 0, rightIndex = nums.length - 1;
while(leftIndex <= rightIndex ){
if(nums[leftIndex]*nums[leftIndex] < nums[rightIndex] * nums[rightIndex] ){
T[t--] = nums[rightIndex] * nums[rightIndex];
rightIndex--;
}else{
T[t--] = nums[leftIndex] * nums[leftIndex];
leftIndex++;
}
}
return T;
}
}
LeetCode 209 长度最小的子数组
题目链接 209.长度最小的子数组
这一题看完想了10分钟,脑子什么都模拟不出来,暴力求出所有的子数组也想不出来。
脑子里想还是不靠谱。于是,去看了下视频,自己这次在本子上写了大概代码,感觉没问题。提交,不通过。发现自己想的还是简单了,没考虑到总和也小于target的情况。
还是要多学习,前辈们总结的方法学以致用。我们要自己能想出来最优解,那就太天才了,不过就算想出来也是前人,早已发现的。所以,暂时没必要花太多时间去考虑那些。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minLength = 0;
int result = Integer.MAX_VALUE;
int j = 0, i = 0,sum = 0;
for(;j < nums.length;j++){
sum += nums[j];
while(sum>=target){
minLength = j - i + 1;
result = result < minLength ? result : minLength;
sum -= nums[i];
i++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
我对滑动窗口的理解:也是循环套了个循环,不过第二个循换加上了条件,所以省去了很多不必要的过程,从而降低时间复杂度。
LeetCode 59 螺旋矩阵II
题目链接: 59.螺旋矩阵II
模拟过程题,这一题再一次验证了区间的划分合理性,和不变性的重要。如果不合理写,就会不断地判断各种条件。感谢前人思考总结的办法。
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] res = new int[n][n];
int start = 0;
int count = 1;
int i = 0,j = 0;
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;
}
}