力扣热题100----------41.缺少的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
示例 2:
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
我的思路是这样的 我们直接把数组当成一个哈希表 将数组里面的值大于0的或者小于n的替换为n+1 第二我们将数组里面的值提取出来 我们直接使用绝对值 让他一定 大于0 然后用一个if判断 判断他小于n我们才进行下列步骤 将这个值当成索引去找到 以这个索引为这个值的数 将他设置为负数 然后我们再次遍历 找到第一个大于0的值 那么他的索引+1就是我们的答案 因为负数的索引值+1的绝对值一定已经出现在数组中了
class Solution {public int firstMissingPositive(int[] nums) {int n=nums.length;for (int i = 0; i < n; i++) {if (nums[i]<=0 || nums[i]>n){nums[i]=n+1;}}for (int i = 0; i < n; i++) {int x=Math.abs(nums[i]);if (x<=n){if (x - 1 >= 0 && x - 1 < n) {nums[x - 1] = -Math.abs(nums[x - 1]);}}}for (int i = 0; i < n; i++) {if (nums[i]>0){return i+1;}}return n+1;}
}