leetcode 41. First Missing Positive

題目要求

Given an unsorted integer array, find the first missing positive integer.

For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space.

在數組中找到第一個漏掉的正整數。若是能夠的話,使用O(N)的時間複雜度和O(1)的空間複雜度。java

思路一:暴力排序後尋找

排序後尋找顯然是最快的。排序的時間複雜度要依靠java底層的依賴。以後再用O(N)的時間複雜度找到第一個漏掉的整數後即退出遍歷。面試

public int firstMissingPositive(int[] nums) {
        int size = nums.length;
        if(size == 0) return 1;
        Arrays.sort(nums);
        int positive = 1;
        for(int i = 0 ; i<size ; i++){
            if(nums[i]<positive) continue;
            if(nums[i]>positive) return positive;
            positive++;
        }
        return positive;
        
    }

思路二:O(1)空間複雜度

要實現這種空間複雜度,通常須要有限數量的臨時變量來記錄遍歷的有效範圍,再利用原有題目中的數據結構來存儲其他的臨時變量。這些臨時變量能夠是排除出的量,也能夠是有效量。在這裏我用leftPointer記錄有效數字的開始下標(即將無效數字轉移到leftPointer左側),利用maxPositive記錄數組最大有效整數(換句話說,若是一個數組的大小爲9,則該數組的最大first missing positive integer即爲10,一旦數組中出現重複或是小於1或是大於9的數字,該數字即爲無效數字)。當遇到的數字爲有效數字時,則將該數字放到對應當前起始下標leftPointer其相應的位置上。數組

public int firstMissingPositive2(int[] nums){
        int size = nums.length;
        int positive = 1;
        int leftPointer = 0;
        int maxPositive = size;
        while(leftPointer<size){
            if(nums[leftPointer] == positive){
                leftPointer++;
                positive++;
            }
            else if(nums[leftPointer] > maxPositive || nums[leftPointer] < positive || nums[leftPointer]==nums[leftPointer+nums[leftPointer]-positive]){
                leftPointer++;
                maxPositive--;
            }else{
                int temp = nums[leftPointer];
                nums[leftPointer] = nums[leftPointer+temp-positive];
                nums[leftPointer+temp-positive] = temp;
            }
        }
        return positive;
    }

clipboard.png
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~微信

相關文章
相關標籤/搜索