You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

区间合并优化:滑动窗口指针管理问题咨询

区间合并优化问题:插入长度≤k的区间最小化不连通组数

问题描述

给定一组闭区间(每个区间由起始值a[i]和结束值b[i]定义),以及可插入的单个区间的最大长度k。目标是插入一个长度≤k的区间,使合并后的不连通区间总数最少。

示例

示例1

输入:

Intervals = [(1, 5), (2, 4), (6, 6), (7, 14), (16, 19)]
k = 2
  • 最优解:插入区间(5,7)(长度等于k),合并后得到2个不连通组;
  • 次优解:插入(14,16)则得到3个组。

示例2

输入:

Intervals = [(1,3),(4,6),(7,9),(10,11),(13,15)]
k = 10
  • 最优解:插入(3,13)可将所有区间合并为1个组。

约束条件

1 <= n <= 2 * 10^5
1 <= a[i] <= b[i] <= 10^9
1 <= k <= 10^9

我的代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> a1 = Arrays.asList(1, 2, 5, 10);
        List<Integer> b1 = Arrays.asList(2, 4, 8, 11);
        int k1 = 2;
        System.out.println(solve(a1, b1, k1));  // Output: 2

        List<Integer> a2 = Arrays.asList(3, 2, 3);
        List<Integer> b2 = Arrays.asList(5, 9, 3);
        int k2 = 10;
        System.out.println(solve(a2, b2, k2));  // Output: 1

        List<Integer> a3 = Arrays.asList(1, 2, 6, 7, 16);
        List<Integer> b3 = Arrays.asList(5, 4, 6, 14, 19);
        int k3 = 2;
        System.out.println(solve(a3, b3, k3));  // Output: 2 

        List<Integer> a4 = Arrays.asList(2,13,27,45,45,33);
        List<Integer> b4 = Arrays.asList(10,24,40,45,45,33);
        int k4 = 12;
        System.out.println(solve(a4, b4, k4));  // Output: 3 
    }
    public static int solve(List<Integer> a, List<Integer> b, int k) {
        int n = a.size();
        int[][] intervals = new int[n][2];
        for (int i = 0; i < n; i++) {
            intervals[i][0] = a.get(i);
            intervals[i][1] = b.get(i);
        }

        // Sort by start time
        Arrays.sort(intervals, Comparator.comparingInt(x -> x[0]));

        // Merge intervals in-place
        List<int[]> merged = new ArrayList<>();
        int[] curr = intervals[0];
        for (int i = 1; i < n; i++) {
            if (curr[1] >= intervals[i][0]) {
                curr[1] = Math.max(curr[1], intervals[i][1]);
            } else {
                merged.add(curr);
                curr = intervals[i];
            }
        }
        merged.add(curr);

        int m = merged.size();
        if (m == 1) return 1;

        // Sliding window to bridge max gaps
        int maxBridged = 0;
        int left = 0;
        for (int right = 0; right < m - 1; right++) {
            int start = merged.get(left)[1];
            int end = merged.get(right + 1)[0];
            while (end - start > k) {
                left++;
                start = merged.get(left)[1];
            }
            maxBridged = Math.max(maxBridged, right - left + 1);
        }

        return m - maxBridged;
    }
}

遇到的问题

我尝试用滑动窗口法找出合并后区间间可被单个长度≤k的区间桥接的最大间隙数,但在左右指针的管理上遇到困难:

  • 右指针应如何在循环中推进?
  • 如何确保左指针不会越界或错误地超过右指针?

内容的提问来源于stack exchange,提问作者CodeCrusader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:33