绝对差不超过限制的最长数组

2021-01-29 20:20

阅读:451

标签:inf   计数器   数列   java   size   数字   整数   image   结束   

技术图片
技术图片

技术图片
技术图片

思路1

思路

  • 既然每个数字都要做开头 双重for循环 O(n^2)

  • 当开头的数字确定时,向后遍历

  • 在每一次向后遍历过程中,动态更新数列中的min和max,同时引用count计数器

  • 验证max-min的绝对差 与 limit 的关系

  • 将符合结果的count 装入集合list

  • 对集合list进行sort排序,取最大值

  • 结果 超出内存限制 时间就更不用提了

代码

/**
     * 绝对差不超过限制的最长连续子数组
     *
     * 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,
     * 该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
     * 如果不存在满足条件的子数组,则返回 0 。
     *
     * ?
     * 53/54  超出内存时间限制
     * @param nums
     * @param limit
     * @return
     */
    public int longestSubarray(int[] nums, int limit) {
        List list=new ArrayList();
        for(int i=0;i

优化思路1

思路

  • O(n^2)肯定需要降下来 ,当时想到滑动窗口 ,但用不熟
  • 没有必要使用集合list来保存各种结果,题目要求最大数组长,取个常量保存即可,在每次遍历中Math.max()方法比较集合
  • 结果 空间没超 时间依旧超出限制
  • 所以O(n^2)一定要降下来

代码

/*
*超出时间限制
**/
public int longestSubarray2(int[] nums, int limit) {
        int ans=0;
        for(int i=0;i

思路2 (滑动窗口)

思路

  • 第一次写的时候 无脑双for ,O(n^2) 最后一个实例 超时超空间
  • 滑动窗口 设置start end 指针,逐个遍历
  • 设置新起点那一步开始,应该可以继续优化

代码

class Solution {
    public int longestSubarray(int[] nums, int limit) {
        int ans = 0;
        int len = nums.length;
        int subMax = 0;
        int min=nums[0];
        int max=min;
        for (int start = 0, end = 0; start  limit) {
                ans = Math.max(ans, end - start);
                start++;
                //新起点
                end=start;
            //因为本次循环结束 进入下一次循环end++,为了保证start和end指针同时指向 新起点,则end--;
                end--;
                min=max=nums[start];
                subMax=0;
            }else{
                ans=Math.max(ans, end-start+1);
            }
        }
        return ans;
    }
}

技术图片
技术图片

绝对差不超过限制的最长数组

标签:inf   计数器   数列   java   size   数字   整数   image   结束   

原文地址:https://www.cnblogs.com/yh-simon/p/12822579.html


评论


亲,登录后才可以留言!