代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数组

文档讲解:代码随想录

状态:有点难度,但不多

 977.有序数组的平方

力扣题目链接

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

  • 输入:nums = [-4,-1,0,3,10]
  • 输出:[0,1,9,16,100]
  • 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

示例 2:

  • 输入:nums = [-7,-3,2,3,11]
  • 输出:[4,9,9,49,121]

视频《代码随想录》算法视频公开课 (opens new window)双指针法经典题目!LeetCode:977.有序数组的平方

思路:双指针法

暴力解法为所有的数平方再排序;而通过双指针法可以简化

以下为原理:

可以设置两个指针,一个在开头,一个在末尾。(默认已经排序)那么数字平方后最大的数一定是开头数字或末尾数字的平方,故可以将这两个数字的平方进行比较,大的一个则放在末尾(为非递减顺序 排序)并且该指针加一,在进行下一次比较;直到重合。

代码如下

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

209.长度最小的子数组

力扣题目链接(opens new window)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

  • 输入:s = 7, nums = [2,3,1,2,4,3]
  • 输出:2
  • 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

视频:

《代码随想录》算法视频公开课 (opens new window)拿下滑动窗口! | LeetCode 209 长度最小的子数组

思路1:暴力解法

补充:Math.min(value1,value2...valueN) :返回参数中最小的值

       Integer.MAX_VALUE 是 Java 中的一个常量,它表示整数数据类型 int 的最大可表示值

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int resurt = Integer.MAX_VALUE;
        for(int i=0;i<nums.length;i++){
            int sum=0;
            for(int j=i;j<nums.length;j++){
                sum=sum+nums[j];
                if(sum>=target){
                    resurt=Math.min(resurt,j-i+1);
                    //Math.min(value1,value2...valueN) :返回参数中最小的值
                    break;
                }
            }
        }
         return  resurt == Integer.MAX_VALUE ? 0 : resurt;
    }
}

但该方法可能超过运行时间

如图:

思路2:滑动窗口

类似暴力解法,但通过一个慢指针一个快指针可以减少执行次数,当第一次获得大于等于目标的数组时,记录该数组并去除第一个,再加后面的数字就可以减少运行的次数。进而减少运行时间。

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

欢迎各位大佬指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值