題目使這樣的:請設計乙個高效演算法,查詢陣列中未出現的最小正整數。
給定乙個整數陣列a,請返回陣列中未出現的最小正整數。
測試樣例:
[-1,2,3,4]
返回1一看到這個題目我想到的是用另外的乙個陣列b,長度為a的長度+1,來儲存遍歷陣列a的數的值。 if(a[i] == i+1) b[i+1] = a[i]。然後遍歷陣列b,出現空缺的地方即是最小未出現的正整數。但是假如要求額外空間複雜度為o(1),那就沒辦法了。有的人會想到排序,但是排序最好需要o(nlog2n)的時間複雜度。如果要求時間複雜度為o(n),並且空間複雜度為o(1),那麼要怎麼做呢?這方法是我在牛客網上看到的。聽完之後,感覺特別不可思議,實在是太厲害了。在我的理解裡,這是一種正向和逆向結合的思想。從前往後和從後往前不停地進行,理想情況和實際情況實時地更新,最後的臨界點必然是兩者相等。
在這個演算法裡,有兩個額外變數。乙個是match,初始值為0。用來標記從正整數1開始已經連續出現的正整數個數。比如說[3, 5, 2, 1, 6] 出現的連續正整數序列為,所以match= 3;還有乙個變數是maxmatch,初始值是整個陣列的長度,因為陣列在沒遍歷之前,無法得知其中的元素,所以看作是最理想的情況:裡面的數剛好是1到n。
說了兩個變數之後,便是演算法的部分了。
首先從第0位置開始,如果a[0]=match+1;那麼說明出現了下乙個連續的正整數,所以match++;
如果a[0] != mach+1,那麼有幾種情況。
第一種情況是,a[0]<=match,那麼這個值是我們不需要的,因為match之前的正整數已經出現了。所以這時候剩下的數最多能使match的值達到maxmatch-1,因為這個無效的元素,需要占用乙個位置。同理如果a[0]>maxmatch,這個值也是不需要的,maxmatch-1;還有就是如果這個數在match和maxmatch的範圍之內,我們需要判斷這個數應該在的位置上,是否已經有了這個數。比如說a[0]=3,那麼我們只需要比較a[2]位置上是否是3,如果是那麼這個數也不是我們需要的,這是maxmatch-1;以上幾種情況都是遍歷的位置上的數是不需要的,那麼我們應該把後面的數調到這個位置上,進行重新搜尋。
還有一種情況就是 match+1a[2];
這樣一直搜尋下去,最終便是達到臨界點,然後結束搜尋。最終的結果便是match+1;
public static int firstmissingposition(int nums) else if(0 == nums.length)
int match = 0;
int maxmatch = nums.length;
while(matchmaxmatch || nums[nums[match]-1] == nums[match])else
}return match+1;
}
**量很少,但是思路真的是很精妙。不得不為之讚嘆!
找出乙個陣列中的」單身「
已知乙個陣列中,除了乙個數字出現一次外,其他數字都出現兩次,試找出這個數 思路分析 當看到這個題目,我就想,既然只有乙個數出現一次,那麼我們可以遍歷這個陣列,只要遇到相同的兩 個 數,就把它們置為乙個比較大的數,最後輸出那個沒有被改變的數。define crt secure no warnings ...
給定乙個陣列,根據陣列名求陣列的長度
題目 給定乙個陣列名字,如何根據陣列名求陣列的長度?本題來自於乙個同學筆試題,筆試中是實現乙個氣泡排序,但是排序的引數只有乙個陣列名,沒有陣列中元素的個數 void bubblesort int a 思路 要先實現這個氣泡排序,首先要獲取這個陣列中陣列元素的個數。然後對陣列排序,下面說一下如何根據陣...
給定乙個陣列,求子陣列的最大異或和
直接說這道題時間複雜度o n 的做法,構建字首樹。假設將0 0 0 1 0 2 0 i 1的異或結果全部裝在字首樹中,那麼以i結尾的最大異或和就是0到某一位置x的異或結果和i異或結果最大,舉個例子,假設x是3,0 3的異或結果和i進行異或得到的結果最大,那麼就說明4 i的異或結果是最大的。但是如何知...