开篇介绍:
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],原本应该有0、1、2、3这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,原本应该有的数字是 0、1、2、3、4,现在数组是 [0, 1, 3, 4]。
- 首先计算
0到4的和:根据等差数列求和公式,和为(0 + 4) * 5 / 2 = 10。 - 然后计算数组中元素的和:
0 + 1 + 3 + 4 = 8。 - 用前者减去后者:
10 - 8 = 2,所以缺失的数字就是2。
例子 2
假设 n = 5,原本数字是 0、1、2、3、4、5,数组是 [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,原本数字是 0、1,数组是 [1]。
0到1的和:(0 + 1) * 2 / 2 = 1。- 数组元素和:
1。 - 差值:
1 - 1 = 0,缺失的数字是0。</

最低0.47元/天 解锁文章
1417

被折叠的 条评论
为什么被折叠?



