给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
1条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
最佳回答 专家已采纳一、分析
思路如下: 1)如果在 1 到 maxn 之间的数字,映射到哈希数组中; 2)然后从 1 开始遍历哈希数组,第一个没有被哈希的就是答案; 3)所有数字都遍历完毕,仍然没有找到,则答案为 $n+1$。
二、源码
#define maxn 500001 int hash[500001], cases = 0; int firstMissingPositive(int* nums, int numsSize){ int i; ++cases; for(i = 0; i < numsSize; ++i) { if(nums[i] > 0 && nums[i] < maxn) hash[ nums[i] ] = cases; // (1) 如果在 1 到 maxn 之间的数字,映射到哈希数组中; } for(i = 1; i <= numsSize; ++i) { if(hash[i] < cases) { return i; // (2) 然后从 1 开始遍历哈希数组,第一个没有被哈希的就是答案; } } return numsSize + 1; // (3) 所有数字都遍历完毕,仍然没有找到,则答案为 n+1; }
采纳该答案 已采纳该答案 专家已采纳评论解决 无用打赏举报微信扫一扫
分享评论登录 后可回复...
报告相同问题?
提交
相关推荐 更多相似问题
- 2021-12-20 11:38回答 1 已采纳 一、分析 思路如下: 1)如果在 1 到 maxn 之间的数字,映射到哈希数组中; 2)然后从 1 开始遍历哈希数组,第一个没有被哈希的就是答案; 3)所有数字都遍历完毕,仍然没有找到,则答案为 $n
- 2021-11-25 10:51回答 2 已采纳 private static int [] m(int[] arr , int target){ Map<Integer,Integer> map = new Hash
- 2021-12-19 15:24回答 1 已采纳 int swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; return tmp; } int remov
- 2020-04-09 16:09加班狗的微博的博客 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为O(n)。 二、思路 通过将数组中的数字放入set中,然后遍历数组,查找set中是否有连续的序列 三、实现 public static int ...
- 2021-02-05 08:32好吃还得是柚子的博客 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 要求 : 解决方案实现时间复杂度为 O(n) 并且只使用常数级别额外空间。 本地编译器运行代码如下: #include<iostream> using ...
- 2020-09-09 09:24我准备起飞的博客 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 提示:给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 分析: 数组中同一个元素不能使用...
- 2022-03-08 15:18回答 2 已采纳 你可以看leetcode的最后一条信息提示,让你不要返回任何值,并且在适当的时候改变nums对象的值。你上面的做法只是让返回的值变成了符合答案的标准,而你的最初始nums数组对象只在你的第一步被反转的
- 2022-03-09 17:41回答 1 已采纳 此处是单独写nums是表示nums的首地址,nums + left是表示第left个元素的地址nums + right同理由于swap函数是通过两个参数的地址将这两个值互换,所以需要传入第left和第
- 2019-06-07 18:32回答 1 已采纳 You either need to pass in the elements individually: nums := []int{10,100,250,99} format := "%02
- 2022-01-26 16:09╰つ栺尖篴夢ゞ的博客 整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的下一个排列就是在这个有序容器中排在它后面的那个排列。如果不存在下一...
- 2020-05-11 15:22kelley_luxuiary的博客 给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是O(logn) 级别。 如果数组中不存在目标值,返回[-1, -1]。 示例 1: 输入: ...
- 2022-01-18:将数组分成两个数组并最小化数组和的差。 给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之2022-01-18 22:10福大大架构师每日一题的博客 给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 。nums 中每个元素都需要放入两个数组之一。 请你返回 最小 的数组和之差。...
- 2017-06-23 20:38回答 5 已采纳 I appreciate @KelvinS' approach, there already exists a math.Pow (though it deals in float64s. Ne
- 2021-06-11 20:22回答 2 已采纳 已解决
- 2021-10-03 21:11回答 2 已采纳 等等,我来 void moveZeroes(int[] nums) { // 0 边界处理 if (nums == null || nums.length ==0)
- 2021-03-02 17:30,,,, ,的博客 class Solution { public int maximumProduct(int[] nums) { //先排序 Arrays.sort(nums); int n = nums.length;...int a = Math.max(nums[0]*nums[1]*nums[n-1],nums[n-1]*nums[n-2]*nums[n-3]); return a; } }
- 2020-09-30 13:33IT信息教室的博客 给定一个未排序的整数列表,找出其中没有出现的最小的正整数,给定列表中可能包含重复的元素。要求算法是时间复杂度是O(n),空间复杂度是O(1)。 测试样例 # Input: [3, 4, -1, 1, 2, 2, 5] # Output: 6 # 列表长度...
- 2021-02-25 10:33声嘶喑哑的博客 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例1 : 输入:nums = [-1,0,1,...
- 2020-04-21 22:16回答 1 已采纳 ``` #include int main(){ int n; int arr1[20]; int arr2[20]; int curr = 0; scanf("%d",
- 2021-07-29 11:53CodeWinter的博客 文章目录@[TOC]1、题目描述:2、解题方法...先将数组中的数由小到大排序,再遍历排序后的结果,如果遍历下标和该下标对应的元素不相等,则返回该下标,如果遍历结束仍然没有符合条件,说明是最后一个数字 n 缺失了,则.
- 没有解决我的问题, 去提问