0
点赞
收藏
分享

微信扫一扫

LeetCode-057-插入区间

扒皮狼 2021-09-28 阅读 43
LeetCode

插入区间

解法一:遍历数组
public class LeetCode_057 {
    public static int[][] insert(int[][] intervals, int[] newInterval) {
        if (intervals == null || intervals.length == 0) {
            return new int[][]{newInterval};
        }
        int length = intervals.length;
        if (newInterval[1] < intervals[0][0]) {
            // 如果新区间的最大值小于所有区间的最小值,则不需要合并,将新区间放在intervals的最前面
            int[][] newIntervals = new int[length + 1][2];
            newIntervals[0] = newInterval;
            for (int i = 0; i < length; i++) {
                newIntervals[i + 1] = intervals[i];
            }
            return newIntervals;
        } else if (newInterval[0] > intervals[length - 1][1]) {
            // 如果新区间的最小值大于所有区间的最大值,则不需要合并,将新区间放在intervals的最后面
            int[][] newIntervals = new int[length + 1][2];
            for (int i = 0; i < length; i++) {
                newIntervals[i] = intervals[i];
            }
            newIntervals[length] = newInterval;
            return newIntervals;
        } else {
            int matchFirst = newInterval[0], matchSecond = newInterval[1], newLength = length + 1;
            boolean[] flag = new boolean[length];
            for (int i = 0; i < length; i++) {
                int curFirst = intervals[i][0], curSecond = intervals[i][1];
                if (((matchFirst >= curFirst && matchFirst <= curSecond) || (matchSecond >= curFirst && matchSecond <= curSecond)) ||
                        ((curFirst >= matchFirst && curFirst <= matchSecond) || (curSecond >= matchFirst && curSecond <= matchSecond))) {
                    // 有交集
                    matchFirst = Math.min(matchFirst, curFirst);
                    matchSecond = Math.max(matchSecond, curSecond);
                    flag[i] = true;
                    newLength--;
                }
            }
            int[][] newIntervals = new int[newLength][2];
            boolean added = false;
            int pos = 0;
            for (int i = 0; i < length; i++) {
                if (!flag[i]) {
                    if (added) {
                        newIntervals[pos++] = intervals[i];
                    } else {
                        if (matchSecond < intervals[i][0]) {
                            newIntervals[pos++] = new int[]{matchFirst, matchSecond};
                            added = true;
                        }
                        newIntervals[pos++] = intervals[i];
                    }
                }
            }
            if (!added) {
                newIntervals[pos++] = new int[]{matchFirst, matchSecond};
            }

            return newIntervals;
        }
    }

    public static void main(String[] args) {
        int[][] intervals = new int[][]{{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}};
        int[] newInterval = new int[]{4, 8};
        for (int[] ints : insert(intervals, newInterval)) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
    }
}
举报

相关推荐

0 条评论