对于消失的数字以及右旋字符数组的题目解析

开篇介绍:

Hello 大家!我们又见面啦~在上一篇博客中,我们系统梳理了时间复杂度与空间复杂度的核心概念 —— 从大 O 表示法的定义,到不同复杂度(如 O (1)、O (logn)、O (n)、O (n²))的量级差异,再到空间复杂度中 “额外空间” 与 “输入输出空间” 的区分。但仅仅掌握理论框架,远不足以应对实际算法问题中的复杂度分析与优化需求。

因此,在本篇博客中,我将通过两道经典例题,带大家从 “概念理解” 走向 “实战应用”—— 不仅会拆解每道题的多种解法,对比不同解法的复杂度差异,还会延伸出算法设计中 “降维优化”“空间换时间” 等核心思路。尤其值得一提的是,其中一道题的某一种解法,我们在上篇博客的复杂度分析案例中曾简要提及,而今天我会在此基础上补充另外两种更优解法,帮大家构建 “一题多解、多解比优” 的思维习惯。

老规矩,在正式讲解前,先为大家附上两道题的官方题目链接,方便大家提前思考或对照原题细节:面试题 17.04. 消失的数字 - 力扣(LeetCode) https://leetcode.cn/problems/missing-number-lcci/submissions/663203686/

189. 轮转数组 - 力扣(LeetCode) https://leetcode.cn/problems/rotate-array/description/

下面,就让我们开始我们的解题之旅。

面试题 17.04. 消失的数字

这道题的难度是不大的,我们先看题目:

题意分析:

输入输出

  • 输入:一个数组 nums,这个数组包含了从 0 到 n 的所有整数,但缺少其中一个。这里的 n 是一个隐含的数,它的值等于数组原本应该有的元素个数减一(因为原本应该有 n + 1 个元素,从 0 到 n)。例如,示例 1 中输入数组是 [3, 0, 1],原本应该有 0123 这 4 个元素(n = 3),所以缺少的是 2;示例 2 中输入数组是 [9, 6, 4, 2, 3, 5, 7, 0, 1],原本应该有 0 到 9 这 10 个元素(n = 9),所以缺少的是 8
  • 输出:找出数组中缺失的那个整数。

约束条件

  • 要求在 O(n) 的时间复杂度内完成。这意味着我们的算法只能遍历数组常数次(比如一次或两次),不能使用嵌套循环等时间复杂度为 O(n²) 及更高的方法。

那么对于这道题,我给大家提供三种方法:

方法一:

这第一个方法呢,其实就是一个思路,是不适合用来解题的,具体如下:

首先我们要把这个数组中的数据全部排序,因为题目说了给的是无序的数据,那么我们要找到消失的数字,既可以通过排序,然后看一下哪个数字的下一个数字不是这个数字加1得到的,有出现的话,那么这个数字+1就是消失的数字。

思路是挺好,但是它的时间复杂度却是不尽人意,首先我们进行排序,一般是用冒泡排序,它的时间复杂度就是O(N^2)了,更别说后续查找还要遍历数组,这远远超过了题目所要求的O(N)的时间复杂度。

所以这第一个思路也就是无法实践了,但是我们依旧可以分析这个思路,毕竟俗话说的好,多一个方法就是多一条路子。

方法二:

这个方法,就可以用于解决题目了,什么思路呢?其实它和数学有关。

题目是说从0到n丢了一个数字,那么也就是说,这个数组中,除了消失的数字之外,其余的从0到n的数字都在呢。

那么,我们就可以使用相加来进行解答,我们把0到n的所有数字全部相加起来(这里大家遍历相加亦或是使用等差数列公式求和都可以),然后再减去数组的数据之和,最后的结果,就是消失的数字,为了方便大家理解,我给大家一些例子:

例子 1

假设 n = 4,原本应该有的数字是 01234,现在数组是 [0, 1, 3, 4]

  • 首先计算 0 到 4 的和:根据等差数列求和公式,和为 (0 + 4) * 5 / 2 = 10
  • 然后计算数组中元素的和:0 + 1 + 3 + 4 = 8
  • 用前者减去后者:10 - 8 = 2,所以缺失的数字就是 2

例子 2

假设 n = 5,原本数字是 012345,数组是 [0, 2, 3, 4, 5]

  • 0 到 5 的和:(0 + 5) * 6 / 2 = 15
  • 数组元素和:0 + 2 + 3 + 4 + 5 = 14
  • 差值:15 - 14 = 1,缺失的数字是 1

例子 3

假设 n = 1,原本数字是 01,数组是 [1]

  • 0 到 1 的和:(0 + 1) * 2 / 2 = 1
  • 数组元素和:1
  • 差值:1 - 1 = 0,缺失的数字是 0。</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值