代码随想录算法训练营第二天 | LeetCode977 有序数组的平方、LeetCode209 长度最小的数组

1. LeetCode977 有序数组的平方

题目

在这里插入图片描述

思路

暴力解题:

for循环一遍数组,求出每个index对应的平方值,然后用Array.sort()函数将数组排序,返回排序后的数组。
缺点:sort函数的时间复杂度高,力扣上显示用时5ms,而下一个方法时间复杂度为O(n),用时只耗费了1ms

双指针法:

因为原数组为非降序数组,决定了平方后,数字大的一定集中在两头,数字小的集中在中间。所以分别用两个指针指向原数组的头和尾,比较头平方和尾平方。再定义一个新数组,用一个指针指向新数组的尾,上述二者中大的值插入到新数组的尾部。

代码

双指针:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] newNums = new int[nums.length];
        for (int i = 0, j = nums.length-1, k = nums.length-1; k >= 0; ){
            if (nums[i]*nums[i] <= nums[j]*nums[j]){
                newNums[k] = nums[j]*nums[j];
                j--;
            }else {
                newNums[k] = nums[i]*nums[i];
                i++;
            }
            k--;
        }
        return newNums;
    }
}

暴力:

class Solution {
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++){
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

2. LeetCode209 长度最小的数组

题目

在这里插入图片描述

思路

暴力法:

外层循环遍历数组所有元素,内存循环找到外层循环定位到某个元素的前提下,其最小连续子数组

双指针法:

讲解链接:

https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html#%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3

用到了滑动窗口的思想,for循环定义窗口右指针遍历数组所有元素,在每次遍历内部,又定义了窗口左指针,结合while,寻找最小长度。

代码

双指针法

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

Integer.MAX_VALUE定义最大值

倒数第二行很重要,属于临界特殊情况处理。即如果都遍历一遍了,sum还是小于target,那说明找不到符合要求的字符串最小长度,则要特殊处理了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值