[LeetCode]41. 缺失的第一个正数

题目

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。

解题思路

因为我们要找的数在 [1, N + 1] 里,最后 N + 1 这个元素我们不用找,只有在前面的 N 个元素都找不到的情况下,我们才返回 N + 1。所以我们可以把原始的数组当做哈希表来使用,将数值为 i 的数映射到下标为 i - 1 的位置,例如 1 这个数放到下标为 0 的位置, 2 这个数放到下标为 1 的位置,按照这种思路整理一遍数组。然后我们再遍历一次数组,第一个遇到的值不等于下标 +1 的那个数,那下标 +1 就是我们要找的缺失的第一个正数。如果遍历完数组也没找到,就返回 N + 1。

复杂度分析:
时间复杂度:O(N),其中 N 是数组的长度。
空间复杂度:O(1)。

代码

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i=0; i<n; i++){
            // 满足在指定范围内、并且没有放在正确的位置上,才交换
            // 例如:数值 3 应该放在索引 2 的位置上
            while(nums[i]>=1 && nums[i]<=n && nums[i] != nums[nums[i]-1]){
                // 交换两个数
                int temp = nums[i];
                nums[i] = nums[temp-1];
                nums[temp-1] = temp;
            }
        }
        for(int i=0; i<n; i++){
            if(nums[i] != i+1){
                return i+1;
            }
        }
        return n+1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章