LeetCode数组类题解( 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度)

£神魔★判官ぃ 2022-12-04 07:49 166阅读 0赞

给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度

该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。

  • 示例 :
    输入:nums = [10,1,2,4,7,2], limit = 5
    输出:4
    解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。
  • 示例 2:
    输入:nums = [4,2,2,2,4,4,2,2], limit = 0
    输出:3
  • 分析

连续子数组,组数组中最大值 - 最小值 <= limit
设置队列中元素左边界i和右边界j,找出队列中的最大值max和最小值min(每次修改队列后都需要更改最大值最小值 ===> 考虑使用队列,规定队列的排序方式)

  • 如果新增元素与最大值最小值的差均符合条件,则右边界j右移,更新子数组的最长长度
  • 如果不符合条件,左边界向右移动

代码:

  1. /** * 连续,子数组中最大值 - 最小值 <= limit * 设置队列元素的左边界i和右边界j * 找出这个队列中的最大值最小值 * 如果新增元素与最大值最小值的差均符合条件,则右边界j右移 * 如果不符合条件,左边界向右移动,同时更新最大值或最小值 * * @param nums * @param limit * @return */
  2. public static int longestSubarray2(int[] nums, int limit) {
  3. if (nums.length == 0 || nums.length == 1) return nums.length;
  4. //i最左侧,j右侧元素,res结果
  5. int i = 0, j = 0, res = 1;
  6. int n = nums.length;
  7. PriorityQueue<Integer> min = new PriorityQueue<>();//获取最小值
  8. PriorityQueue<Integer> max = new PriorityQueue<>(Collections.reverseOrder());//规定队列排序的方式,获取最大值
  9. while (i < n && j < n) {
  10. if (min.size() == 0) {
  11. min.add(nums[j]);
  12. max.add(nums[j]);
  13. j++;
  14. continue;
  15. }
  16. //最大值 - 当前值 <= limit&& 最大值 - 当前值 <=limit
  17. if(Math.abs(nums[j]- min.peek() )<=limit && Math.abs(max.peek() - nums[j])<=limit){
  18. min.add(nums[j]);
  19. max.add(nums[j]);
  20. res = Math.max(res,j-i+1);
  21. j++;
  22. }else {
  23. min.remove(nums[i]);
  24. max.remove(nums[i]);
  25. i++;
  26. }
  27. }
  28. return res;
  29. }

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读