您现在的位置是:首页 >学无止境 >代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II网站首页学无止境

代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

weixin_53549736 2024-07-01 11:59:52
简介代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

leetcode 977 有序数组的平方

题目链接

977. 有序数组的平方 - 力扣(LeetCode)

做题过程

最开始的时候,虽然想到了用双指针的方法进行操作,但想到的是将双指针放在中间位置(nums[k] > 0), 然后左右移动。但这样做容易数组越界。 在查看思路后,修改为从两头往中间跑,而不是中间往两头跑。这样做更容易解决问题。

以下为错误的思路

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = 0;
        int temp = 0;
        int[] result = new int[nums.length]; 
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= 0) {
                right = i;
                left = right -1;
                break;
            }
        } 
​
        while (temp < nums.length) {
            if (nums[left] * nums[left] >= nums[right] *nums[right]) {
                result[temp] = nums[right] * nums[right];
                right++;
                temp++;
            }
            else if (nums[left] * nums[left] < nums[right] *nums[right]) {
                result[temp] = nums[left] * nums[left];
                left--;
                temp++;
            }
        }
        return result;
    }
}

解决方法

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int temp = nums.length - 1;
        int[] result = new int[nums.length]; 
        while (temp >= 0) {
            if (nums[left] * nums[left] >= nums[right] *nums[right]) {
                result[temp] = nums[left] * nums[left];
                left++;
                temp--;
            }
            else if (nums[left] * nums[left] < nums[right] *nums[right]) {
                result[temp] = nums[right] * nums[right];
                right--;
                temp--;
            }
        }
        return result;
    }
}

leetcode 209 长度最小的子数组

题目链接

209. 长度最小的子数组 - 力扣(LeetCode)

做题过程

这题是用滑动窗口的方式。应为之前做过这道题目。在做题时很快想到了思路,也知道如何去做。但在写代码时,如何收缩窗口一直没想明白。最后参考答案,利用双指针的方法很快做出。

解决方法

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;
        int fast = 0; 
        int slow = 0;
        int total = 0;
        for (;fast < nums.length; fast++) {
            total += nums[fast];
            while (total >= target) {
                result = Math.min(result, fast - slow + 1);
                total -=nums[slow];
                slow++;
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

leetcode 704 二分查找

题目链接

59. 螺旋矩阵 II - 力扣(LeetCode)

做题过程

这道题以前做过。本质就是通过4个for循环从4条边边上填空。然后收缩在填写内边。知道无边可填。需要注意的是,若n为基数。需要填写中心点位置。

解决方法

class Solution {
    public int[][] generateMatrix(int n) {
        int k = 1;
        int l = 0;
        int[][] nums = new int[n][n];
        int s = n;
        while (s > 0) {
            int i = l;
            int j = l;
            for(; j < n - l -1; j++) {
                nums[i][j] = k;
                k++;
            }
            for (; i < n - l - 1; i++) {
                nums[i][j] = k;
                k++;
            }
            for(; j > l; j--) {
                nums[i][j] = k;
                k++;
            }
            for(; i > l; i--) {
                nums[i][j] = k;
                k++;
            }
            s = s - 2;
            l++;
        }
        if (n % 2 == 1) {
            nums[n/2][n/2] = k++;
        }
        return nums;
    }
}

总结

  1. 数组还是要灵活的注意双指针的使用。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。