leetcode-zgd-day2-977.有序数组的平方/209.长度最小的子数组/59.螺旋矩阵

1,681 阅读1分钟

977.有序数组的平方

题目链接:Loading Question... - 力扣(LeetCode)

本体的解题思路是:采用双指针法,从后向前更新结果数组

以下是两种不同的写法:

 class Solution {
     public int[] sortedSquares(int[] nums) {
         int[] result = new int[nums.length];
         int left = 0;
         int right = nums.length - 1;
         int ai = right;
         int n;
         for (int i = 0; i < nums.length; i++){
             nums[i] = (int)Math.pow(nums[i],2);
         }
 //      for (int x : nums){
 //          x = (int)Math.pow(x,2);
 //      }
         while(left <= right){
             if(nums[left]< nums[right]){
                 result[ai--] = nums[right--];
             }else{
                 result[ai--] = nums[left++];
             }
         }
         return result;
     }
 }

主要是想记录一下,上述代码中普通for循环和增强for循环的差别:

         for (int i = 0; i < nums.length; i++){
             nums[i] = (int)Math.pow(nums[i],2);
         }
 //      for (int x : nums){
 //          x = (int)Math.pow(x,2);
 //      }

在本题目中,普通for循环就可以正确AC,而增强for循环不可以。原因在于,上例中,增强for循环中的x并不是数组中对应元素的引用,而只是和数组中元素值相等的变量值。所以基本数据类型在用增强for循环进行循环操作修改时,修改会失效。

参考博文:(103条消息) java普通for循环与增强for循环差别_HiBOYOO的博客-CSDN博客

 class Solution {
     public int[] sortedSquares(int[] nums) {
         int[] ans = new int[nums.length];
         int left = 0, right = nums.length - 1;
         int i = nums.length - 1;
         while(left <= right){
             if(Math.pow(nums[left],2) <= Math.pow(nums[right],2)){
                 ans[i--] = (int)Math.pow(nums[right--],2);
             }
             else{
                 ans[i--] = (int)Math.pow(nums[left++],2);
             }
         }
         return ans;
     }
 }

209.长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

这个题目是滑动窗口的典型题目,通过左右指针维护一个虚拟的窗口,使得窗口中得数值满足某种条件。

 class Solution {
     public int minSubArrayLen(int target, int[] nums) {
         // 滑动窗口,通过左右指针,维护一个窗口,该窗口中的target值始终大于7
         int left = 0, right = 0;
         int n = nums.length;
         int sum = 0;
         int min = Integer.MAX_VALUE;
         while(right < n && sum < target){
             sum += nums[right++];
         }
         if(right == n && sum < target) return 0;
         while(right <= n){ // 此处应该考虑得是循环结束得条件,而不是陷入到逻辑当中,当右指针走到最后一个元素的下下个元素时,循环就已经可以结束了。
             if(sum >= target){
                 min = min > right - left ? right -left : min;
                 sum -= nums[left++];
             }
             else{
                 if(right < n) sum += nums[right];
                 right++;
             }
         }
         return min;
     }
  }

59.螺旋矩阵

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

解题思路:不要陷入到题目中,想着如何一圈一圈的模拟循环,这样是写不出来的,因为边界条件一直在变,我们要维护不变的量, 只要抓住维护边界条件这个思路,这个题就不难了。代码如下:

 class Solution {
     public int[][] generateMatrix(int n) {
         // 维护边界进行循环,切记陷入题目当中,去一步步模拟
         int l = 0, r = n - 1, u = 0, d = n - 1;
         int j = 1;
         int[][] ans = new int[n][n];
         int time = (int)Math.pow(n,2);
         while(j <= time){
             for(int i = l; i <= r; i++){
                 ans[u][i] = j++;
             }
             u++;
             for(int i = u; i <= d; i++){
                 ans[i][r] = j++;
             }
             r--;
             for(int i = r; i >= l; i--){
                 ans[d][i] = j++;
             }
             d--;
             for(int i = d; i >= u; i--){
                 ans[i][l] = j++;
             }
             l++;
         }
         return ans;
     }
 }

\