3 合并区间

本文介绍了如何在Java中合并重叠区间,通过排序、遍历和利用数组操作实现。详细讲解了toArray方法、System.arraycopy的使用以及Arrays.copyOf的源码分析。还涉及到了Java反射机制的基础应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

class Solution {
    public int[][] merge(int[][] intervals) {
if (intervals.length == 0) return intervals;
        //1、对二维数组按照第一列升序排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        //2、进行合并数组
        List<int []> list = new ArrayList<>();
        int term[] =intervals[0];//临时引用,1 判断是否需要合并集合,2 是否放入结果集
        for (int i = 1; i < intervals.length; i++) {
            if (term[1]>=intervals[i][0]){
                term[1]=Math.max(term[1],intervals[i][1]);
            }else {
                list.add(term);
                term=intervals[i];
            }
        }
        list.add(term);
        return list.toArray(new int[0][]);
    }
}

作者:Hailin

1、对二维数组进行排序,按照第一列升序列排列
2、借用临时空间,判断是否需要何合并集合当前值,当前集合是否放入结果集触发点

知识点

1 利用toArray将list转成二维数组

List<int[]> list = new ArrayList<>();
list.toArray(new int[0][]);

为什么写0?看ArrayList的toarray源码

public <T> T[] toArray(T[] a) {
    if (a.length < size)
        // Make a new array of a's runtime type, but my contents:
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

当T泛型的长度没有list的size大时,会以size长度返回T;否则,使用传入的T。为了节省空间(长度太长,数组后面的都会赋值null,就会比真正的结果多出一截null),toArray(new int[0][])里面的一维数组长度写0就行

2 System.arraycopy拷贝

System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。对于一维数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。

System.arraycopy的函数原型是:
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
其中:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。
原文链接

3 Arrays.copyOf

源码

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

4 反射

在Java的反射机制中,数组可以通过getClass()方法获得数组的Class<? extend T[]>对象,数组的Class对象可以通过getComponentType()方法可以取得一个数组的Class<?>对象, 通过Array.newInstance()可以反射生成数组对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值