时间复杂度的降低

原地哈希映射
问题的引入
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
1 | 输入: |
限制:2 <= n <= 100000
普通哈希(费空间):
1 | class Solution { |
原地哈希(空间复杂度:1)
1 | class Solution { |
原地哈希的应用
力扣41.缺失的第一个正数
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
示例 1:
1 | 输入:nums = [1,2,0] |
示例 2:
1 | 输入:nums = [3,4,-1,1] |
示例 3:
1 | 输入:nums = [7,8,9,11,12] |
提示:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
由于数值范围太大,普通哈希无法满足。所以应该采用第二种方法,原地哈希。
优质方法:原地哈希
把数组视为哈希表,对数字进行原地交换。而缺失的数字一定在 [1, N+1] 的范围里面,我们可以把原数组作为哈希表来使用。
确定映射法则:hash[num] = num+1;
1 | class Solution { |
- 标题: 时间复杂度的降低
- 作者: 卡布叻_米菲
- 创建于 : 2023-07-01 21:29:29
- 更新于 : 2024-02-08 11:44:13
- 链接: https://carolinebaby.github.io/2023/07/01/力扣题/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论