算法leetcode|56. 合并区间(rust重拳出击)

2023-10-10 13:50

本文主要是介绍算法leetcode|56. 合并区间(rust重拳出击),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 56. 合并区间:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


56. 合并区间:

以数组 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].

样例 2:

输入:intervals = [[1,4],[4,5]]输出:[[1,5]]解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 如果没想到排序是比较麻烦的,而下定决定使用排序也不是那么容易,因为排序本身的时间复杂度也不低,但是对于这个情况来说,还是很值得的。
  • 区间有两个值,应该按照开始值排序,而不是末尾值,当然逆向处理也是可以的,但是违背常理。
  • 根据区间开始值排序,前一个区间的末尾和下一个区间的开始值会出现几种情况:
    1. 前一个区间和后一个区间没有交集,那么当前区间就处理完毕,直接开始处理下一个区间。
    2. 前一个区间和后一个区间有部分重叠,那么就将两个区间合并,然后接着处理下一个区间。
    3. 前一个区间完整包含了后一个区间,那么直接抛弃后一个区间,然后继续处理下一个区间。
  • 后两种情况可以统一认为是有重叠,只需要统一处理为更新当前处理区间的末尾值即可。


题解:

rust:

impl Solution {pub fn merge(mut intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {intervals.sort_unstable();let mut ans: Vec<Vec<i32>> = Vec::new();let (mut l, mut r) = (intervals[0][0], intervals[0][1]);intervals.iter().skip(1).for_each(|cur| {if r < cur[0] {// 没重合ans.push(vec![l, r]);l = cur[0];r = cur[1];} else {// 重合r = r.max(cur[1]);}});ans.push(vec![l, r]);return ans;}
}

go:

func merge(intervals [][]int) [][]int {sort.Slice(intervals, func(i, j int) bool {return intervals[i][0] < intervals[j][0]})var ans [][]intlast := intervals[0]for i := 1; i < len(intervals); i++ {cur := intervals[i]if last[1] < cur[0] {// 没有重合ans = append(ans, last)last = cur} else {// 有重合if cur[1] > last[1] {last[1] = cur[1]}}}ans = append(ans, last)return ans
}

c++:

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end());vector<vector<int>> ans;for (int i = 0; i < intervals.size(); ++i) {const int l = intervals[i][0], r = intervals[i][1];if (ans.empty() || ans.back()[1] < l) {ans.push_back({l, r});} else {ans.back()[1] = max(ans.back()[1], r);}}return ans;}
};

python:

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x: x[0])ans = []for interval in intervals:if not ans or ans[-1][1] < interval[0]:# 不重合ans.append(interval)else:# 重合ans[-1][1] = max(ans[-1][1], interval[1])return ans

java:

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));final List<int[]> ans  = new ArrayList<int[]>();int[]             last = intervals[0];for (int i = 1; i < intervals.length; ++i) {final int[] cur = intervals[i];if (last[1] < cur[0]) {// 没重合ans.add(last);last = cur;} else {// 重合last[1] = Math.max(last[1], cur[1]);}}ans.add(last);return ans.toArray(new int[ans.size()][]);}
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


这篇关于算法leetcode|56. 合并区间(rust重拳出击)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180867

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为