首页 > 编程语言 >合并区间算法示意

合并区间算法示意

时间:2023-02-27 20:14:18浏览次数:29  
标签:示意 java int res 合并 算法 intervals 区间 new

给定一堆区间,可能存在交集,对区间进行合并返回没有交集的区间集合。本文记录了这种问题的一种解法

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Test2 {
    public static void main(String[] args) {
        int[][] intervals = new int[5][2];
        intervals[0] = new int[]{1,3};
        intervals[1] = new int[]{2,5};
        intervals[2] = new int[]{3,8};
        intervals[3] = new int[]{9,10};
        intervals[4] = new int[]{2,6};

        List<int[]> res = mergeIntervals(intervals);
        for (int[] arr : res) {
            System.out.println(Arrays.toString(arr));
        }
    }

    //合并区间,把多个有交集的区间进行合并,最后返回没有交集的区间集合
    // [[1,3],[2,5],[3,8],[9,10],[2,6]]
    public static List<int[]> mergeIntervals(int[][] intervals) {
        if (null == intervals) {
            throw new ArithmeticException("参数不能为null");
        }
        List<int[]> res = new ArrayList<>();
        if (intervals.length < 2) {
            res.add(new int[]{intervals[0][0], intervals[0][1]});
        }
        //按区间左端点升序排列
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        int start = intervals[0][0];
        int end = intervals[0][1];
        int i=1;
        while(i< intervals.length) {
            int[] current = intervals[i];
            // 前一个区间的终点<下一个的起点,区间是断开的,[star,end]可以加入结果集
            if(end<current[0]) {
                res.add(new int[]{start,end});
                start = current[0];
                end =current[1];
            } else {
                //前一个和下一个有交集,修改end为前一个终点和下一个终点的最大值
                int max =Math.max(end,current[1]);
                end =max;
            }
            i++;
        }

        //合并结束,把start,end加入结果集
        res.add(new int[]{start,end});

        return res;
    }
}

标签:示意,java,int,res,合并,算法,intervals,区间,new
From: https://www.cnblogs.com/chengxuxiaoyuan/p/17161676.html

相关文章

  • 代码随想录算法训练营Day27 回溯算法|39. 组合总和 40.组合总和II 131.分割回文串
    代码随想录算法训练营39.组合总和题目链接:39.组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 targ......
  • 多文件夹下Excel指定列的提取合并
    一、前言大家好,我是崔艳飞,工作中经常遇到,从多个文件夹下的Excel中,提取指定列,再合并成新的Excel。几个文件夹还能应付,但要是有成百上千个文件夹,你就要哭了,本文针对此问题,实......
  • LSB隐写分析算法实现
    分析步骤确定LSB嵌入的方式:LSB嵌入方式有很多种,如连续LSB嵌入、随机LSB嵌入、二进制交替LSB嵌入等。不同的嵌入方式对应着不同的检测方法,因此,在开始编写算法之前,需要确定......
  • LeetCode 周赛 334,在算法的世界里反复横跳
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天是LeetCode第334场周赛,你参加了吗?这场周赛考察范围比较基础,整体难度......
  • python算法基础
    一、简介定义和特征定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定......
  • JAVA加载PMML算法模型
    注:加载失败时尝试修改pmml文件版本为4.3依赖<dependency><groupId>org.jpmml</groupId><artifactId>pmml-evaluator</artifactId><version>1.4.1</versi......
  • topN算法问题
    问题:如何在10亿个整数中找出前1000个最大的数?小顶堆堆排序首先,我们需要构建一个大小为N(1000)的小顶堆,小顶堆的性质如下:每一个父节点的值都小于左右孩子节点,然后依次从......
  • 【算法笔记】Day of Week
    DayofWeek时间限制:1Sec  内存限制:32MB提交:2252  解决:692 题目描述WenowusetheGregorianstyleofdatinginRussia.Theleapyearsareyearswith......
  • stl算法汇总
          ......
  • 数的进制转换【《算法竞赛进阶指南》】
    数的进制转换编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。这里有62个不同数位{0−9,A−Z,a−z}。输入格式第一行输入一个整数,代表接下来的行数。......