1. 程式人生 > 其它 >LeetCode:57. Insert Interval (向一個區間中插入一個區間)

LeetCode:57. Insert Interval (向一個區間中插入一個區間)

技術標籤:javaleetcode演算法資料結構

文章最前: 我是Octopus,這個名字來源於我的中文名--章魚;我熱愛程式設計、熱愛演算法、熱愛開源。所有原始碼在我的個人github;這部落格是記錄我學習的點點滴滴,如果您對 Python、Java、AI、演算法有興趣,可以關注我的動態,一起學習,共同進步。

相關文章:

  1. LeetCode:55. Jump Game(跳遠比賽)
  2. Leetcode:300. Longest Increasing Subsequence(最大增長序列)
  3. LeetCode:560. Subarray Sum Equals K(找出陣列中連續子串和等於k)

文章目錄:

題目描述:

java實現方法1:

python實現方法1:

github原始碼地址:


題目描述:

給出一個無重疊的 ,按照區間起始端點排序的區間列表。

在列表中插入一個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。

示例1:

輸入:intervals = [[1,3],[6,9]], newInterval = [2,5]
輸出:[[1,5],[6,9]]

示例2:

輸入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
輸出:[[1,2],[3,10],[12,16]]
解釋:這是因為新的區間 [4,8] 與 [3,5],[6,7],[8,10]重疊。

來源:力扣(LeetCode)


java實現方法1:

  /**
     * 插入新區間合併之後
     *
     * @param intervals   區間
     * @param newInterval 新區間
     * @return 新區間
     */
    public int[][] insert2(int[][] intervals, int[] newInterval) {
        int left = newInterval[0];
        int right = newInterval[1];
        boolean placed = false;
        List<int[]> intervalList = new ArrayList();
        for (int[] interval : intervals) {
            if (interval[0] > right) {
                // 在插入區間的右側且無交集
                if (!placed) {
                    intervalList.add(new int[]{left, right});
                    placed = true;
                }
                intervalList.add(interval);
            } else if (interval[1] < left) {
                // 在插入區間的左側且無交集
                intervalList.add(interval);
            } else {
                // 與插入區間有交集,計算它們的並集
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        if (!placed) {
            intervalList.add(new int[]{left, right});
        }
        int[][] ans = new int[intervalList.size()][];
        for (int i = 0; i < intervalList.size(); ++i) {
            ans[i] = intervalList.get(i);
        }
        return ans;
    }

時間複雜度:O(n)

空間複雜度: O(n)


python實現方法1:

 def insert(self, intervals: List[List[int]], new_interval: List[int]) -> List[List[int]]:
        '''
            一個排序好的區間插入一個區間
        Args:
            intervals: 聯絡區間
            new_interval: 新區間
        Returns:
            合併後區間
        '''
        left = new_interval[0]
        right = new_interval[1]
        place = False
        result = []
        for interval in intervals:
            if interval[0] > right:
                if not place:
                    result.append([left, right])
                    place = True
                result.append(interval)
            elif interval[1] < left:
                result.append(interval)
            else:
                left = min(left, interval[0])
                right = max(right, interval[1])
        if not place:
            result.append([left, right])
        return result

時間複雜度:O(n)

空間複雜度: O(n)


github原始碼地址:

https://github.com/zhangyu345293721/leetcode