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

一、LeetCode977.有序数组的平方

阅题思路:最开始看到这道题的时候,只能想到暴力解——把原有的数组遍历一边,每一个元素平方,然后再排序。看了《代码随想录》笔记之后,学到了“双指针”的方法。

步骤拆解:

代码如下:

public static int[] sortedSquares(int[] nums) {
        int length = nums.length;
        // 定义双指针
        int low;
        int high = length - 1;
        // 定义一个k指针用来给新数组赋值;
        int k = high;
        // 设置一个新数组,用来存放平方后的结果
        int[] sortedSquares = new int[length];
        // 遍历输入数组
        for (low = 0; low <= high; low++) {
            if (nums[low] * nums[low] <= nums[high] * nums[high]) {
                // 输入数组右边的值平方更大
                sortedSquares[k--] = nums[high] * nums[high];
                high--;
                low--;
            } else {
                // 左边的值平方更大
                sortedSquares[k--] = nums[low] * nums[low];
            }
        }
        return sortedSquares;
    }

 二、LeetCode209.长度最小的子数组

阅题思路:最开始看到这道题没有任何思路,暴力破解也没有想到,所以去看了讲解。今天是第三次写这道题,已经能够理解用“滑动窗口法”解决,但是相比称做这个叫法,我还是认为可以归类为一种“双指针法”。

步骤拆解:

 代码如下:

public int minSubArrayLen(int target, int[] nums) {
        // 设置快慢指针
        int slow = 0;
        int fast = 0;
        // 设置一个sum来保存当前子数组的和
        int sum = 0;
        // 设置一个子序列长度的暂存值,因为后续要在while循环中取较小的
        int subLength = 0;
        // 给子序列长度设置初值(返回值),因为要取最小的,所以最开始初值可以设为int的最大值
        int result = Integer.MAX_VALUE;
        // 循环遍历数组
        for (fast = 0; fast < nums.length; fast++) {
            // 快指针移动,统计和
            sum += nums[fast];
            while (sum >= target) {
                // 此时sum的值已经大于目标值,计算子序列的长度
                subLength = (fast - slow) + 1;
                // 先把当前最小的结果值保存起来
                result = Math.min(subLength, result);
                // 将慢指针向前移动,看是否还能够满足sum的要求
                sum -= nums[slow];
                slow++;
            }
        }
        // 遍历完之后,只有两种情况:
        // 情况一:遍历完了还没有进入while循环,说明整个数组之和都是小于target的,此时result是int的最大值
        // 情况二:找到了符合题意的最小子数组,这个时候直接返回result就好
        return result == Integer.MAX_VALUE ? 0 : result;
    }

三、LeetCode59.螺旋矩阵Ⅱ

阅题思路:这道题看着题目直接去看了视频讲解,我觉得讲的很好;看了三遍视频,写了大概两次,现在是有思路可以实现了。

视频地址:拿下螺旋矩阵!LeetCode:59.螺旋矩阵II

代码如下:

public int[][] generateMatrix(int n) {
        // 构造二维数组
        int[][] matrix = new int[n][n];
        // 设置坐标值 x y
        int startX = 0;
        int startY = 0;
        // 设置圈数
        int loop = 0;
        // 设置循环停止/开始的偏移量
        int offset = 1;
        // 设置填入二维数组的值
        int count = 1;
        // 设置遍历的坐标值
        int i = 0;
        int j = 0;

        // 循环遍历
        // 圈数是 n / 2,奇数行列的数组把中间一块拿出来单独处理
        while (loop < n / 2) {
            // 遍历上方的行
            for (j = startX; j < n - offset; j++) {
                matrix[startX][j] = count++;
            }
            // 遍历右边的列
            for (i = startY; i < n - offset; i++) {
                matrix[i][j] = count++;
            }
            // 遍历下方的行
            for (; j >= offset; j--) {
                matrix[i][j] = count++;
            }
            // 遍历左边的列
            for (; i >= offset; i--) {
                matrix[i][j] = count++;
            }

            // 给一圈赋值完毕
            loop++;
            startX++;
            startY++;
            offset++;
        }
        // 判断是否是奇数二维数组,如果是的话,要给中间的最后一块赋值
        if (n % 2 != 0) {
            matrix[startX][startY] = count;
        }
        return matrix;
    }

  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组平方",和Leetcode 209 "长度最小数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小数组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值