题解 | #合并区间#

合并区间

https://www.nowcoder.com/practice/0596b6232ce74b18b60ba0367d7f2492

解题思路

  1. 这是一个区间合并问题,需要将重叠的区间合并成一个区间
  2. 解题步骤:
    • 将输入的区间按照起始位置排序
    • 遍历排序后的区间,判断相邻区间是否重叠
    • 如果重叠,则更新当前区间的结束位置
    • 如果不重叠,则将当前区间加入结果集
  3. 最后输出所有合并后的区间

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int beg, end;
    char temp;
    vector<vector<int>> blocks_temp;
    
    // 读取输入
    while(cin >> beg >> temp >> end) {
        blocks_temp.push_back({beg, end});
    }
    
    // 按区间起始位置排序
    sort(blocks_temp.begin(), blocks_temp.end());
    
    vector<vector<int>> blocks;
    blocks.push_back({blocks_temp[0][0], blocks_temp[0][1]});
    
    // 合并区间
    for(int i = 1; i < blocks_temp.size(); i++) {
        if(blocks_temp[i][0] <= blocks.back()[1]) {
            blocks.back()[1] = max(blocks_temp[i][1], blocks.back()[1]);
        } else {
            blocks.push_back({blocks_temp[i][0], blocks_temp[i][1]});
        }
    }
    
    // 输出结果
    for(int i = 0; i < blocks.size(); i++) {
        cout << blocks[i][0] << "," << blocks[i][1];
        if(i < blocks.size() - 1) cout << " ";
    }
    
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] intervals = line.split(" ");
        
        List<int[]> blocksList = new ArrayList<>();
        for(String interval : intervals) {
            String[] nums = interval.split(",");
            blocksList.add(new int[]{
                Integer.parseInt(nums[0]),
                Integer.parseInt(nums[1])
            });
        }
        
        // 按区间起始位置排序
        Collections.sort(blocksList, (a, b) -> a[0] - b[0]);
        
        List<int[]> result = new ArrayList<>();
        result.add(blocksList.get(0));
        
        // 合并区间
        for(int i = 1; i < blocksList.size(); i++) {
            if(blocksList.get(i)[0] <= result.get(result.size()-1)[1]) {
                result.get(result.size()-1)[1] = Math.max(
                    blocksList.get(i)[1],
                    result.get(result.size()-1)[1]
                );
            } else {
                result.add(blocksList.get(i));
            }
        }
        
        // 输出结果
        for(int i = 0; i < result.size(); i++) {
            System.out.print(result.get(i)[0] + "," + result.get(i)[1]);
            if(i < result.size() - 1) System.out.print(" ");
        }
    }
}
def merge_intervals(intervals):
    # 按区间起始位置排序
    intervals.sort(key=lambda x: x[0])
    
    result = [intervals[0]]
    
    # 合并区间
    for interval in intervals[1:]:
        if interval[0] <= result[-1][1]:
            result[-1][1] = max(interval[1], result[-1][1])
        else:
            result.append(interval)
    
    return result

# 读取输入
line = input().strip()
intervals = []
for interval in line.split():
    start, end = map(int, interval.split(','))
    intervals.append([start, end])

# 合并区间并输出
result = merge_intervals(intervals)
print(' '.join(f'{interval[0]},{interval[1]}' for interval in result))

算法及复杂度

  • 算法:排序 + 一次遍历
  • 时间复杂度: - 主要来自排序
  • 空间复杂度: - 需要存储合并后的区间
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-24 20:25
腾讯今年实习招了这么多人,后面秋招还会招人吗??想着秋招再战来着
牛客965593684号:腾讯好像2020年之后就是实习生招得多,应届生基本上不招,纯实习转正
点赞 评论 收藏
分享
想按时下班的我在等offer:我投测试也是这个情况,不知道咋办了
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务