• 个人博客:https://javaniuniu.com/
  • 难度:中等
  • 本题涉及算法: 滑动窗口
  • 思路:滑动窗口
  • 类似题型:
    • 3. 无重复字符的最长子串
    • 5393. 可获得的最大点数

题目 1438. 绝对差不超过限制的最长连续子数组

给你一个整数数组 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

提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
0 <= limit <= 10^9

方法一 滑动窗口

解题思路

  1. 维护一直最大值和最小值

  2. 维护一个最长数组
    sub_nums增加的条件={abs(num−curr_max)<=limit判断当前元素是否复合条件,当前元素和数组中最大元素比较abs(num−curr_min)<=limit判断当前元素是否复合条件,当前元素和数组中最小元素比较abs(curr_max−curr_min)<=limit判断数组中元素是否符合条件,数组中最大元素和最小元素比较sub\_nums增加的条件=\begin{cases} abs(num - curr\_max) <= limit & 判断当前元素是否复合条件,当前元素和数组中最大元素比较\\ abs(num - curr\_min) <= limit & 判断当前元素是否复合条件,当前元素和数组中最小元素比较 \\ abs(curr\_max - curr\_min) <= limit & 判断数组中元素是否符合条件,数组中最大元素和最小元素比较 \end{cases}sub_nums增加的条件=⎩⎪⎨⎪⎧​abs(num−curr_max)<=limitabs(num−curr_min)<=limitabs(curr_max−curr_min)<=limit​判断当前元素是否复合条件,当前元素和数组中最大元素比较判断当前元素是否复合条件,当前元素和数组中最小元素比较判断数组中元素是否符合条件,数组中最大元素和最小元素比较​

  3. 当不复合数组增加条件,则以当前长度向后移动

  4. 在向后移动的同时,数组中元素也在在发生变化,所以需要更新数组中的最大最小值

执行过程 举例 nums = [10,1,2,4,7,2] limit = 5

python

class Solution(object):def longestSubarray(self, nums, limit):if not nums:return 0curr_max = nums[0] # 当子数组下最大值 这里初始化为第一个数curr_min = nums[0] # 当子数组下最大值 这里初始化为第一个数sub_nums = [] # 以数组作为窗口滑动for num in nums:if abs(num - curr_max) <=  limit and abs(num - curr_min) <=  limit and abs(curr_max - curr_min) <= limit:curr_max = max(num,curr_max)curr_min = min(num,curr_min)sub_nums.append(num)else:    sub_nums.append(num)sub_nums.pop(0)curr_max = max(sub_nums) # 当子数组最大值curr_min = min(sub_nums) # 当前子数组最小值return  len(sub_nums)

java

class Solution {public int longestSubarray(int[] nums, int limit) {if (nums ==null || nums.length==0)return 0;int curr_max = nums[0]; // 当子数组下最大值 这里初始化为第一个数int curr_min = nums[0]; // 当子数组下最大值 这里初始化为第一个数Queue<Integer> sub_nums = new LinkedList<>();for(int num:nums){if (Math.abs(num - curr_max) <=  limit && Math.abs(num - curr_min) <=  limit && Math.abs(curr_max - curr_min) <= limit) {curr_max = Math.max(num,curr_max);curr_min = Math.min(num,curr_min);sub_nums.offer(num);}else{sub_nums.offer(num);sub_nums.poll();curr_max = Collections.max(sub_nums); // 当子数组最大值curr_min = Collections.min(sub_nums); // 当前子数组最小值}}return sub_nums.size();}
}

错误代码

本想设计一个 时间复杂度为 n 的 结果错了 尴尬

  • 错误答案 错在 [10,1,2,4,7,2] 5
class Solution(object):def longestSubarray(self, nums, limit):""":type nums: List[int]:type limit: int:rtype: int"""if not nums:return 0curr_max = nums[0] # 当子数组下最大值 这里初始化为第一个数curr_min = nums[0] # 当子数组下最大值 这里初始化为第一个数len_max = 0 # 最长子数组长度len_curr = 0 # 当前子数组长度for num in nums:if abs(num - curr_max) <  limit and abs(num - curr_min) <  limit:curr_max = max(num,curr_max)curr_min = min(num,curr_min)len_curr += 1else:len_max = max(len_max,len_curr)curr_max = num # 下一个子数组当前最大值curr_min = num # 下一个子数组当前最小值len_curr = 1 # 因为该下标已经计算过一次 所以 设置当前子数组长度为 1return max(len_max,len_curr) # 当数组中所有数都满足条件 则len_max,len_curr 进行比较

[leetcode]1438. 绝对差不超过限制的最长连续子数组相关推荐

  1. LeetCode 1438 绝对差不超过限制的最长连续子数组

    题目链接 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件的子数组 ...

  2. ⭐算法入门⭐《队列 - 单调队列》中等02 —— LeetCode 1438. 绝对差不超过限制的最长连续子数组

  3. 1438. 绝对差不超过限制的最长连续子数组

    链接:1438. 绝对差不超过限制的最长连续子数组 题解: https://leetcode-cn.com/problems/longest-continuous-subarray-with-abso ...

  4. leetcode 1438. 绝对差不超过限制的最长连续子数组(滑动窗口+treemap)

    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件的子数组,则返回 ...

  5. leetcode1438. 绝对差不超过限制的最长连续子数组

    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件的子数组,则返回 ...

  6. LeetCode-1438. 绝对差不超过限制的最长连续子数组

    题目描述: 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件的子数 ...

  7. [LetCode-1438] 绝对差不超过限制的最长连续子数组

    题目 - letcode1438 难度 - 中等 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 l ...

  8. 力扣刷题笔记:1438. 绝对差不超过限制的最长连续子数组(滑窗模板题,选择有序列表SortedList()数据类型就不会超时)

    题目: 1438.绝对差不超过限制的最长连续子数组 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 ...

  9. 力扣1438——绝对差不超过限制的最长连续子数组(滑动窗口+单调队列)

    题目描述(中等) 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条件 ...

最新文章

  1. GAN(Generative Adversarial Network,GAN)模型应用
  2. Nginx配置文件粗解
  3. windows下怎么安装protobuf for python
  4. php增加mysql用户_mysql 增加用户
  5. php 当前页面停留时间,PHP 记录页面停留时间
  6. Linux编辑firmware的文件,Linux中request_firmware 的用法
  7. gitserver提交代码的总结
  8. Visual Studio自动生成XML类和JSON类
  9. QT D:\搜狗输入法\SogouInput\Components\ 13:53:42: 程序异常结束。 13:53:42: T
  10. 简单的 OpenGL 纹理贴图不起作用?
  11. informatic动态变量的创建和使用
  12. 和机器人问问题的软件_如何开发一个特定领域的自动问答机器人(Chat Bot)?
  13. 客户端,从服务器上下载文件流程
  14. (43.1)【web应用漏洞发现】漏洞平台、开发框架、CMS漏扫工具
  15. untiy 串口通信
  16. SQL 面试用题(重点)
  17. 四轴无人机动力学模型
  18. 【Leetcode】1152. Analyze User Website Visit Pattern
  19. JavaScript踩坑(5)比值函数 function(a, b)
  20. Veins/OMNeT/SUMO:TraCI的getRoadId()方法不能判断junction

热门文章

  1. JAVA广度优先搜索---寻找从A点到B点最短路径
  2. 【ROM制作工具】如何精简ROM?快速精简ROM详细教程!
  3. [Servlet] HttpServletRequest
  4. vscode代码自动保存插件_VSCode 云同步扩展设置 Settings Sync 插件
  5. 路演活动平台,怎么报名参加创业路演?
  6. 阿里云购买云服务器流程及注意事项(新手用户必看图文教程)
  7. 大赛来袭 | 千万项目商机+超40W大赛奖金,快来报名吧!
  8. nuscenes instance 调研笔记
  9. 由AFX_IDW_PANE_FIRST宏的含义分析界面库XTP的一个bug
  10. python的运算符(上)