算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

  • 图

  • 区间

    • 插入区间
      • 题目描述
      • 思路解析
      • C++代码
      • 复杂度分析
    • 合并区间
    • 无重叠区间
  • 链表

  • 矩阵

  • 字符串

  • 树

  • 堆

  • 逻辑思维

  • 目录
  • 区间
华南溜达虎
2024-07-08
目录

插入区间

题目链接: https://leetcode.cn/problems/insert-interval/

# LeetCode 57.插入区间

# 题目描述

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

举个例子:

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

# 思路解析

循环遍历数组intervals,对于newInterval和intervals[i]我们分三种情况来讨论:

  1. newInterval在intervals[i]的左边,此时把newInterval和intervals区间[i,n)的元素依次压入res中,并返回res, 其中n为intervals的大小,res为存储结果的数组。

  1. newInterval在intervals[i]的右边,此时把intervals[i]压入res中,newInterval继续跟intervals[i]后面的元素比较,++i。

  1. newInterval和intervals[i]有重叠,更新newInterval。newInterval[0] = min(newInterval[0], intervals[i][0]),newInterval[1] = max(newInterval[1], intervals[i][1]),更新后的newInterval继续和intervals[i]后面的元素比较,++i。

# C++代码

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {

        vector<vector<int>> res;
        int intervals_len = intervals.size();
        for (int i = 0; i < intervals_len; ++i) {
            //newInterval在intervals[i]的左边
            if (newInterval[1] < intervals[i][0]) {
                //res中保存newInterval
                res.push_back(newInterval);
                for (int j = i; j < intervals_len; ++j) {
                    res.push_back(intervals[j]);
                }
                return res;
            //newInterval在intervals[i]的右边
            } else if (newInterval[0] > intervals[i][1]) {
                //res中保存intervals[i]
                 res.push_back(intervals[i]);
            //newInterval和intervals[i]重叠
            } else {
                //更新newInterval
                newInterval[0] = min(newInterval[0], intervals[i][0]);
                newInterval[1] = max(newInterval[1], intervals[i][1]);
            }

        }
        
        res.push_back(newInterval);
        return res;
    }
};

# 复杂度分析

时间复杂度: 需要遍历一遍数组intervals,所以时间复杂度为O(n),其中n为数组的长度。

空间复杂度: 需要用到res来保存结果,所以空间复杂度为O(n),其中n为数组的长度。

上次更新: 2024/07/08, 20:31:33
最长连续序列
合并区间

← 最长连续序列 合并区间→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式