给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
进阶: 空间复杂度 ,时间复杂度
数据范围:
import java.util.*; public class Solution { /* 方法一:将数组中出现过的元素添加到一个hashmap中,并记录数组中的最大值 然后从i从1加到n,依此判断i是否载hashmap中出现过,如果hashmap中没有出现过,直接返回这个数字。 如果都出现过,就返回n+1。 空间复杂度:O(n),时间复杂度:O(n) */ public int minNumberDisappeared (int[] nums) { // write code here if(nums==null||nums.length==0){ return -1; } HashMap<Integer,Integer> hashmap = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ hashmap.put(nums[i],1); } for(int i=1;i<nums.length;i++){ if(!hashmap.containsKey(i)){ return i; } } return nums.length+1; } /* 方法二:假设数组长度为n,那么缺失的数不是1-n,就是n+1 因为是寻找缺失的最小正整数,所以可以先把数组中的负数和零移除出查找范围,将其改为n+1。 以[-2,3,4,1,5]为例,改成[6,3,4,1,5] 然后再遍历数组,如果nums[i]小于等于n,将nums[i]-1对应的下标上的值改为负数,表示该位置的正整数已经出现 对于上面的数组,n=5: i=0时,nums[i]=6,没有更改 i=1时,nums[i]=3,将数组下标为2的数值改为负数,即[6,3,-4,1,5],表示3已经出现过了 i=2时,nums[i]=4,将数组下标为3的数值改为负数,即[6,3,-4,-1,5],表示4已经出现过了 i=3时,nums[i]=1,将数组下标为0的数值改为负数,即[-6,3,-4,-1,5],表示1已经出现过了 i=4时,nums[i]=5,将数组下标为4的数值改为负数,即[-6,3,-4,-1,-5],表示5已经出现过了 然后再遍历数组,遇到的第一个大于零的数,证明该下标位置的数字没有出现过,返回下标+1 否则证明1-n的数都出现过,返回n+1即可。 最后,对于[-6,3,-4,-1,-5],因为下标为0,2,3,4的位置上都是负数,证明1,3,4,5都出现过 nums[1]=3是出现的第一个大于零的数,证明该下标所代表的数字没有出现过,该下标为1,代表的数字是2。 返回2。 */ public int minNumberDisappeared (int[] nums) { for(int i=0;i<nums.length;i++){ if(nums[i]<=0){ nums[i] = nums.length+1; } } for(int i=0;i<nums.length;i++){ int x = Math.abs(nums[i]); if(x <= nums.length){ nums[x-1] = (-1) * Math.abs(nums[x-1]); } } for(int i=0;i<nums.length;i++){ if(nums[i] > 0){ return i+1; } } return nums.length+1; } }
public class Solution { public int minNumberDisappeared (int[] nums) { int n = nums.length; //原地交换[1,n]区域的数字x到x-1位置 for (int i = 0; i < nums.length; i++) { while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) { int j = nums[i] - 1; swap(nums, i, j); } } //遍历数组,如果i位置的数不是i+1,则就是最小缺失的正整数 for (int i = 0; i < n; i++) { if (nums[i] != i + 1) { return i + 1; } } //否则就是n+1 return n + 1; } void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
class Solution { public: int minNumberDisappeared(vector<int>& nums) { int n = nums.size(); for(int i=0;i<n;++i){ while(nums[i]>0 && nums[i]<=n && nums[i]!=i+1){ swap(nums[i],nums[nums[i]-1]); } } for(int i=0;i<n;++i){ if(nums[i]!=i+1) return i+1; } return n+1; } };
public int minNumberDisappeared (int[] nums) { // write code here Arrays.sort(nums); int res=1; for(int i=0;i<nums.length;i++){ if(nums[i]<=0){ continue; } if(res!=nums[i]){ return res; }else{ res++; } } return res; }
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param nums int整型一维数组 # @return int整型 # class Solution: def minNumberDisappeared(self , nums: List[int]) -> int: # write code here min_num = 1 nums.sort() for n in nums: # 如果出现的值和当前相等,则最小值+1 if n == min_num: min_num += 1 # 若比最小值大,则当前记录的最小值就是最小值 elif n > min_num: return min_num return min_num
import java.util.*; import java.util.stream.Collectors; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberDisappeared(int[] nums) { Set<Integer> set = Arrays.stream(nums).boxed().collect(Collectors.toSet()); int i=1; while (set.contains(i)){ i++; } return i; } }
class Solution { public: int minNumberDisappeared(vector<int>& nums) { int res=1; sort(nums.begin(),nums.end()); for(int x:nums) { if(x<=0)continue; if(x==res)res++; else return res;; } return res; } };
int minNumberDisappeared(int* nums, int numsLen ) { // write code here //缺失的第一个正整数只可能在1~500001中取 int a[500001]; int i; //遍历nums并在a中记录 for (i = 0; i < numsLen; i++){ if (nums[i] > 0 && nums[i] <=500000) a[nums[i]]++; } //找到第一个出现次数为0的下标 for (i = 1; i < 500001; i++){ if (a[i] == 0) return i; } //前500000个数字没有,那么只可能是500001了 return 500001; }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int minNumberDisappeared(vector<int>& nums) { // 时间复杂度O(N),空间复杂度O(1) int n = nums.size(); for (int &num : nums) if (num <= 0) num = n + 1; for (int &num : nums) if (num <= n) nums[abs(num) - 1] *= -1; for (int i = 0; i < n; ++i) if (nums[i] > 0) return i + 1; return n + 1; } };
1首先确定数组数目 2自定义一个标识数组,以数据值为索引,值为1则存在这个数,为0就不存在 3 遍历标识数组,碰到为0直接返回索引值,如果全为1,则返回数据数组长度+1 public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberDisappeared (int[] nums) { // write code here int[] data=new int[nums.length+1]; Arrays.fill(data,0); for(int i=0;i<nums.length;i++){ if(nums[i]>=0&&nums[i]<=nums.length){ data[nums[i]]=1; } } for(int i=1;i<data.length;i++){ if(data[i]==0){ return i; } } return nums.length+1; } }
import java.util.*; public class Solution { public int minNumberDisappeared (int[] nums) { int[] arr = new int[nums.length+2]; for(int i =0; i < nums.length; i++){ if(nums[i]>0&&nums[i]<arr.length){ arr[nums[i]] = i+1; } } int i = 1; while(arr[i]!=0){ i++; } return i; } }
class Solution { public: int minNumberDisappeared(vector<int>& nums) { // 原地哈希 int len = nums.size(); for(int i=0; i<len; i++){ if(nums[i] <= len && nums[i] > 0 && nums[nums[i]-1]!=nums[i]){ swap(nums[nums[i]-1], nums[i]); i--; } } int ans = len+1; for(int i=0; i<len; i++){ if(nums[i]!=i+1) {ans = i+1; break;} } return ans; } };
class Solution: def minNumberDisappeared(self , nums: List[int]) -> int: # write code here num_set = set(nums) for i in range(1, len(num_set)): if i not in num_set: return i return len(nums)+1