leetCode 41.First Missing Positive (第一個丟失的正數) 解題思路和方法


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)時間內常數量空間,所以此題較為考察思維敏捷性。其解題核心思想是將數組的第i位存正數i+1。最后再遍歷一次就可以。

其它人的思想,我也是看了這個思想自己寫的代碼。

盡管不能再另外開辟很數級的額外空間,可是能夠在輸入數組上就地進行swap操作。

思路:交換數組元素。使得數組中第i位存放數值(i+1)。

最后遍歷數組,尋找第一個不符合此要求的元素,返回其下標。整個過程須要遍歷兩次數組,復雜度為O(n)

下圖以題目中給出的第二個樣例為例,解說操作過程。

媽蛋。這題掙扎好久。

首先思路上,其次臨界條件,這題和以下題異曲同工:

n個元素的數組,里面的數都是0~n-1范圍內的,求數組中反復的某一個元素。沒有返回-1, 要求時間性能O(n) 空間性能O(1)。


代碼還是比較簡單。例如以下:

public class Solution {
    public int firstMissingPositive(int[] nums) {
        if(nums.length == 0)
            return 1;
        //第i位存放i+1的數值
        for(int i = 0; i < nums.length;i++){
            if(nums[i] > 0){//nums[i]為正數,放在i+1位置
                //假設交換的數據還是大於0且<i+1,則放在合適的位置,且數據不相等,避免死循環
                //這個while是關鍵,其它都是沒有難度的
                while(nums[i] > 0 && nums[i] < i+1 && nums[i] != nums[nums[i] -1]){
                    int temp = nums[nums[i]-1];//交換數據
                    nums[nums[i]-1] = nums[i];
                    nums[i] = temp;
                }
            }
        }
        //循環尋找不符合要求的數據,返回
        for(int i = 0; i < nums.length;i++){
            if(nums[i] != i+1){
                return i+1;
            }
        }
        //假設都符合要求,則返回長度+1的值
		return nums.length + 1;
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM