算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

1. 有序数组的平方

977. 有序数组的平方

  • 第一想法:暴力破解

  • 看完题解想法:朝着双指针方向想

  • 遇到困难:

    • 用双指针的话,一开始想到两边指针往中间靠,逐个将最大值赋给结果数组。和题解不同的是,循环条件我写了 while (left != right) {...},相比于题解的 while (left <= right) {...},我需要在后面单独为第一个元素赋值(因为没有cover到最后一个元素就跳出循环了)

    • 判断条件中,对于nums[left] == nums[right]这种情况,一开始的想法是两头同时逼近与赋值。但是在最后两个元素相同时,此想法报错(例如:[-1, 0, 0, 2])。因此左右指针相等时,可以将其归到两边指针中的一边执行。

public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];

        for (int i = 0; i < nums.length; i++) {
            nums[i] *= nums[i];
        }

        int left = 0; 
        int right = nums.length - 1;
        int curr = right;

        // 一开始写了while (left != right) {...},就需要最后手动赋值
        while (left <= right) {
            if (nums[left] >= nums[right]) {
                res[curr] = nums[left];
                left++;
            } else if (nums[left] < nums[right]) {
                res[curr] = nums[right];
                right--;
                
            }
            curr--;
        }
        // 最后一个元素时需要手动赋值
        // res[0] = nums[left];
        return res;
    }
  • 时长与收获:

    • 双指针循环条件需要cover到边界

    • 左右两边元素相等时,可以选择一遍执行

    • 时长:30min

2. 长度最小的子数组

209. 长度最小的子数组

  • 第一想法:可以想到双指针

  • 看完题解想法:和题解想法差不多,主要差别在:计算数组元素个数语句count = Math.min()的位置不同。官方题解把该语句在while (sum >= target)循环内,意思是计算每一步sum >= target的最小值;而我放在了循环外,再+1

  • 遇到困难:

    1. 每次循环内代码的执行顺序不是很明确(例如什么时候指针移动,什么时候累加)。

    2. 最后忘记将Integer.MAX_VALUE转成了0

  • 时长与总结:

    1. 右指针的移动伴随着总数的累加,因此累加操作要在每个循环的开头

    2. 时长:40min

public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int sum = 0;
        int count = Integer.MAX_VALUE;

        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (sum < target) continue;

            // 1.1 取到sum < target长度最大时跳出循环
            while (sum >= target) {
                sum -= nums[left];
                left++;
            }
            // 1.2 这里需要额外+1,意思是把 sum < target最大长度 变成 sum >= target最小长度
            count = Math.min(count, i - left + 1 + 1);
            
        }
        // 2.1 不存在符合条件的数组时,返回0
        return count == Integer.MAX_VALUE? 0 : count;
    }

3. 螺旋矩阵II

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值