力扣经典150题第四十七题:汇总区间

devtools/2024/11/14 2:40:49/

目录

      • 题目描述和要求
      • 示例解释
      • 解题思路
      • 算法实现
      • 复杂度分析
      • 测试和验证
      • 总结和拓展
      • 参考资料

题目描述和要求

给定一个无重复元素的有序整数数组 nums,要求返回恰好覆盖数组中所有数字的最小有序区间范围列表。即,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字。

列表中的每个区间范围 [a,b] 应该按如下格式输出:

  • “a->b”,如果 a != b
  • “a”,如果 a == b

示例解释

示例 1:

输入:nums = [0,1,2,4,5,7]
输出:[“0->2”,“4->5”,“7”]
解释:区间范围是:

  • [0,2] --> “0->2”
  • [4,5] --> “4->5”
  • [7,7] --> “7”

示例 2:

输入:nums = [0,2,3,4,6,8,9]
输出:[“0”,“2->4”,“6”,“8->9”]
解释:区间范围是:

  • [0,0] --> “0”
  • [2,4] --> “2->4”
  • [6,6] --> “6”
  • [8,9] --> “8->9”

解题思路

一种简单的方法是遍历数组,对连续的数字进行合并形成区间。具体步骤如下:

  1. 初始化一个结果列表,用于存储最终的区间范围。
  2. 使用双指针,分别标记区间的起始和结束位置。
  3. 遍历数组,如果当前数字与前一个数字连续,则更新结束位置;否则,将前一个区间加入结果列表,并更新起始和结束位置。
  4. 将最后一个区间加入结果列表。
  5. 返回结果列表。

算法实现

import java.util.ArrayList;
import java.util.List;public class SummaryRanges {public List<String> summaryRanges(int[] nums) {List<String> result = new ArrayList<>();if (nums == null || nums.length == 0) {return result;}int start = nums[0];int end = nums[0];for (int i = 1; i < nums.length; i++) {if (nums[i] == end + 1) {end = nums[i];} else {if (start == end) {result.add(Integer.toString(start));} else {result.add(start + "->" + end);}start = nums[i];end = nums[i];}}if (start == end) {result.add(Integer.toString(start));} else {result.add(start + "->" + end);}return result;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为数组的长度。遍历一次数组。
  • 空间复杂度:O(1)。除了结果列表外,不需要额外的空间。

测试和验证

编写测试用例对算法进行验证,确保其正确性和健壮性。

public class Main {public static void main(String[] args) {SummaryRanges summaryRanges = new SummaryRanges();int[] nums1 = {0, 1, 2, 4, 5, 7};System.out.println(summaryRanges.summaryRanges(nums1)); // ["0->2", "4->5", "7"]int[] nums2 = {0, 2, 3, 4, 6, 8, 9};System.out.println(summaryRanges.summaryRanges(nums2)); // ["0", "2->4", "6", "8->9"]}
}

总结和拓展

本题通过简单的数组遍历和区间合并的方式,实现了求解给定有序整数数组的最小区间范围列表。这个算法简单高效,在处理类似问题时是一个不错的选择。

此外,我们也可以考虑优化算法以提高效率,例如使用更高效的数据结构或算法来实现同样的功能。

参考资料

  • 《力扣经典150题》
  • LeetCode 官方网站

http://www.ppmy.cn/devtools/23822.html

相关文章

ECMAScript和JavaScript的区别

ECMAScript和JavaScript在多个方面存在区别。 首先&#xff0c;ECMAScript是JavaScript语言的规范和标准&#xff0c;由Ecma国际组织制定。它定义了JavaScript的语法、类型、语句、关键字以及保留字、操作符、对象等。JavaScript则是基于ECMAScript规范的一种实现&#xff0c;…

Thinkphp使用dd()函数

用过Laravel框架的同学都知道在调试代码的时候使用dd()函数打印变量非常方便&#xff0c;在ThinkPHP6及以上的版本框架中也默认加上了这个函数。但是在ThinkPHP5或更低版本的框架中&#xff0c;dd 并不是一个内置的方法&#xff0c;不过我们可以手动添加这个函数&#xff0c;步…

opencv 存储像素值为浮点数的图像 (.tiff)

在存储32CF1格式的深度图像时&#xff0c;怎么也存储不对 存储成jpg格式的&#xff0c;会乱码。be like 13.6的数据存储之后再读取变成…e-30存储成png格式时&#xff0c;会自动把浮点数转换成整数。13.6的数据读取之后就变成14了直接把深度图片存储成.npy格式python处理很简单…

Docker常见问题排查思路与实战

Docker作为一种流行的容器化技术&#xff0c;已经在众多场景中得到广泛应用。然而&#xff0c;在使用过程中&#xff0c;我们难免会遇到各种问题。本文将介绍一些常见的Docker问题及其排查思路&#xff0c;并通过实战案例帮助大家更好地理解和应对这些挑战。 1. Docker容器启动…

Python计算两个时间的时间差(工作笔记需要自取)

目录 专栏导读方法1&#xff1a;方法2总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &#x1f44d; 该系列文章…

Java web第四次作业

要求&#xff1a;读取xml文件并在页面中显示出来。 采用三种方式实现&#xff0c;并体会其中的原理&#xff1a; 1.常规方式&#xff0c;controlller控制器不分层 代码&#xff1a;RestController public class PoetController { RequestMapping("/listPoet") pu…

图片恢复光影效果;通过拖拽等操作编辑3D实物;Cohere开源RAG技术;智能对话客服工具ChatGPT-On-CS

✨ 1: IntrinsicAnything 可以在光照条件未知的情况下&#xff0c;从单一图像中恢复出物体的材质 它就像是一位拥有高超技艺的画家&#xff0c;能够在仅有一张照片的情况下&#xff0c;准确地揭示出画中物体的材质&#xff0c;甚至在没有知道光线条件的情况下&#xff0c;都能…

iOS 模拟请求 (本地数据调试)

简介 在iOS 的日常开发中经常会遇到一下情况&#xff1a;APP代码已编写完成&#xff0c;但后台的接口还无法使用&#xff0c;这时 APP开发就可能陷入停滞。此时iOS 模拟请求就派上用场了&#xff0c;使用模拟请求来调试代码&#xff0c;如果调试都通过了&#xff0c;等后台接口…