zoukankan      html  css  js  c++  java
  • Leetcode 1438. 绝对差不超过限制的最长连续子数组 单调队列 滑动窗口

    地址  https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/

    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
    
    如果不存在满足条件的子数组,则返回 0 。
    
     
    
    示例 1:
    
    输入:nums = [8,2,4,7], limit = 4
    输出:2 
    解释:所有子数组如下:
    [8] 最大绝对差 |8-8| = 0 <= 4.
    [8,2] 最大绝对差 |8-2| = 6 > 4. 
    [8,2,4] 最大绝对差 |8-2| = 6 > 4.
    [8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
    [2] 最大绝对差 |2-2| = 0 <= 4.
    [2,4] 最大绝对差 |2-4| = 2 <= 4.
    [2,4,7] 最大绝对差 |2-7| = 5 > 4.
    [4] 最大绝对差 |4-4| = 0 <= 4.
    [4,7] 最大绝对差 |4-7| = 3 <= 4.
    [7] 最大绝对差 |7-7| = 0 <= 4. 
    因此,满足题意的最长子数组的长度为 2 。
    示例 2:
    
    输入:nums = [10,1,2,4,7,2], limit = 5
    输出:4 
    解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。
    示例 3:
    
    输入:nums = [4,2,2,2,4,4,2,2], limit = 0
    输出:3

    解答

    尝试使用滑动指针  查找某个连续范围 该范围最大最小值差不超过limit 长度越大越好

    很明显的单调队列的性质

    但是使用哈希记录连续范围内的各个值的排序也不错 加上比较好写。就用哈希了

    代码

    class Solution {
    public:
        map<int,int> in;
        int longestSubarray(vector<int>& nums, int limit) {
        if(nums.size()<2) return nums.size();    
        int l = 0; int r = 1;
        in[nums[0]]++;
        int ans = 0;
        while (l < nums.size() && r < nums.size()) {
            if (in.rbegin()->first - in.begin()->first > limit) {
                int val = nums[l];
                in[val]--; l++;
                if (in[val] == 0) in.erase(val);
            }
            else {
                int val = nums[r];
                in[val]++; 
                if (in.rbegin()->first - in.begin()->first <= limit) {
                    ans = max(ans, r - l + 1);
                }
                r++;
            }
        }
    
        return ans;
    }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    python函数练习题2
    python函数练习题1
    数字是否是10的整数倍
    关于循环的作业:登陆程序
    用for循环写这段代码
    while循环语句
    在CentOS8 上安装Python3
    时隔半年再写购物车程序并改进
    vue上传
    根据生日计算年龄
  • 原文地址:https://www.cnblogs.com/itdef/p/12832639.html
Copyright © 2011-2022 走看看