leetcode之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(nlogn)。

int firstMissingPositive(int A[], int n) {
		if(n == 0)
			return 1;
		if(n == 1){
		    if(A[0] == 1)
				return 2;
			return 1;
		}
		sort(A,A + n);
		int i = 0;
		for(; i < n; i++){
		    if(A[i] > 0 )
				break;
		}
		if(i >= n && A[n - 1] <= 0)
			return 1;
		if(A[i] != 1)
			return 1;
		while(++i < n){
		    if(A[i] - A[i - 1] == 1 || A[i] - A[i - 1] == 0)
				continue;
			break;
		}
		if(i < n)
		    return A[i - 1] + 1;
		return A[n - 1] + 1;
    }
在時間複雜度爲O(n)的前提下,排序方法是不可用的,此時可以藉助數組下標與數組元素的對應關係來進行判斷,我們可以讓A[i] 存放i+1,然後再從頭查找不滿足此條件的數組即可得出第一個缺失的正數,特殊情況是都滿足此條件,最後返回n + 1.。在遍歷的過程中,我們只關注0到n之間的元素而對其他元素不考慮,另外就是交換時要用while(而不能用if)來進行連續交換,以避免某些元素沒有回到最終的位置(因爲有可能交換髮生在已遍歷的元素中)。

int firstMissingPositive(int A[], int n) {
	    if(n == 0)
			return 1;
		for(int i = 0; i < n; i++){
			while(A[i] != i + 1 && A[i] > 0 && A[i] <= n && A[A[i] - 1] != A[i])
				swap(A[i],A[A[i] - 1]);
		}		
		for(int i = 0; i < n; i++){
		    if(A[i] != i + 1)
				return i + 1;
		}
		return n + 1;
	}



發佈了85 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章