当前位置: 首页 > news >正文

LeetCode题练习与总结:丢失的数字--268

一、题目描述

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

提示:

  • n == nums.length
  • 1 <= n <= 10^4
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

二、解题思路

  1. 首先,我们可以利用等差数列求和公式计算 [0, n] 范围内所有数的和,其中 n 是数组 nums 的长度。
  2. 然后,我们遍历数组 nums,将每个元素从等差数列的和减去,剩下的数就是缺失的数字。

三、具体代码

class Solution {public int missingNumber(int[] nums) {// 计算等差数列的和,即[0, n]的和int n = nums.length;int total = (0 + n) * (n + 1) / 2;// 遍历数组,减去每个元素for (int num : nums) {total -= num;}// 剩下的数就是缺失的数字return total;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 计算等差数列的和:这一步是一个常数时间的操作,因为它只涉及几个基本的算术运算(加法、乘法和除法),与输入数组 nums 的大小无关。因此,这一步的时间复杂度是 O(1)。

  • 遍历数组 nums:这一步涉及一个循环,该循环会遍历数组中的每个元素一次。如果数组的大小是 n,那么循环将执行 n 次。因此,这一步的时间复杂度是 O(n)。

综合上述两步,算法的总时间复杂度是 O(n),因为 O(1) + O(n) = O(n)。

2. 空间复杂度
  • 变量 n 和 total:这两个变量都是基本数据类型(整型),它们占用的空间不随输入数组 nums 的大小而变化。因此,它们的空间复杂度是 O(1)。

  • 输入数组 nums:虽然这个数组本身在算法中是输入,但是空间复杂度分析通常只考虑算法额外使用的空间。因此,输入数组的空间不计入算法的空间复杂度。

综上所述,算法的总空间复杂度是 O(1),因为它只使用了固定数量的额外空间。

五、总结知识点

  1. 类定义 (class Solution): 这是Java中的类定义语法,表明我们定义了一个名为 Solution 的类。

  2. 方法定义 (public int missingNumber(int[] nums)): 这是Java中定义方法的语法,表明我们定义了一个名为 missingNumber 的公共方法,它接受一个整数数组 nums 作为参数,并返回一个整数。

  3. 数组长度获取 (int n = nums.length): 这是获取数组长度的方法,length 是数组的一个属性,它返回数组的元素数量。

  4. 算术运算 (int total = (0 + n) * (n + 1) / 2): 这里使用了加法、乘法和除法来计算等差数列的和,遵循算术运算的优先级规则。

  5. 循环遍历 (for (int num : nums)): 这是一个增强型 for 循环,用于遍历数组 nums 中的每个元素,每次循环将数组中的一个元素赋值给变量 num

  6. 赋值运算 (total -= num): 这是赋值运算符的用法,它等同于 total = total - num,用于从 total 中减去当前遍历到的数组元素。

  7. 返回语句 (return total;): 这是Java中返回方法结果的语法,表示将 total 的值作为方法的返回值。

  8. 整型数据类型 (int): 在这个方法中,所有的变量都是 int 类型,这是Java中用于表示整数的原始数据类型。

  9. 逻辑顺序 (// 注释): 代码中使用了注释来解释代码的逻辑,虽然注释不是Java语言的一部分,但它们对于代码的可读性和维护性是非常重要的。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.mrgr.cn/news/42329.html

相关文章:

  • 习题5 循环
  • 如何让70B参数的大型语言模型在资源有限的边缘设备上高效运行?
  • C/S模型的简单实现(UDP服务器)、本地套接字(sockaddr_un )的讲解
  • 银河麒麟V10 SP1如何进入救援模式?
  • 骨架屏 (懒加载优化)
  • 1.9 物理层设备
  • 高性能防静电主轴4033 AC-ESD 在线路板切割中的非凡表现
  • Java定时器的使用与实际应用场景
  • 淡水鱼目标检测数据集 31类 2900张 鱼数据集带标注 voc yolo
  • Java中的对象比较:Comparator与Comparable的最佳实践
  • Bootstrap 4 导航栏:构建响应式和现代的网页导航
  • SQL专项练习第一天
  • wpa_cli支持EAP-AKA认证运行设计
  • XHTML 简介
  • java 编译失败 内部 java 编译器错误
  • 螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)
  • Java | Leetcode Java题解之第454题四数相加II
  • 读数据湖仓06数据集成
  • 疾风气象大模型如何预测气象数据,预测数据怎么获得
  • JavaWeb——Vue组件库Element(5/6):案例:组件实现(概述、Form表单、Table表格、Pagination 分页、效果展示、完整代码)