LeetCode41(Java解法)

題目:

給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]
輸出: 3
示例 2:

輸入: [3,4,-1,1]
輸出: 2
示例 3:

輸入: [7,8,9,11,12]
輸出: 1
說明:

你的算法的時間複雜度應爲O(n),並且只能使用常數級別的空間。

想法:因爲題目規定不能開闢額外的空間,所以,考慮到遍歷數組,n爲數組長度。如果nums[i]大於零且數字在n以內,且沒有在應該的位置,將其放到其規定的位置,有點像分好了n個桶,將該位置的數字放到其應該在的桶。然後再遍歷一次數組,看看第一個不符合的桶,返回。如果所有的n個數都在其正確的位置,那麼第一個缺失的數就是n+1。

解法:

public static int firstMissingPositive(int[] nums) {
        for(int i = 0;i < nums.length;i++) {
            while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != nums[nums[i] - 1])
                swap(nums,i,nums[i]-1);
        }
        for(int i = 0;i < nums.length;i++) {
            if(nums[i] != i + 1) return i + 1;
        }
        return nums.length + 1;
    }
    public static void swap(int[] nums,int i,int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章