日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

第一个缺失数字

發(fā)布時(shí)間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一个缺失数字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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.

思路:

桶排的思想

從頭到尾遍歷數(shù)組,在位置 i,希望放置的元素是 i+1, 如果不是,

就把 A[ i ] 和 A[ A[i] -1 ] 的元素,這樣就保證了 A[i]-1位置的元素是 A[i],

不斷重復(fù)上面這個(gè)過(guò)程,直到 A[ i ] == i+1 或者 A[i] 沒(méi)有辦法再交換,

A[i] 沒(méi)有辦法再交換的情況有:

A[i] <= 0: ?A[i]-1 是無(wú)效下標(biāo);

A[i] > n: A[i]-1 是無(wú)效下標(biāo);

A[i] == A[ A[i]-1]: 交換沒(méi)有意義。

這樣過(guò)后,有效的元素 i 一定放在了 A[i-1] 處,第一個(gè) A[i] != i+1 的元素就是第一個(gè)缺少的正數(shù)了。

因?yàn)橛玫氖峭芭诺乃枷?#xff0c;所以復(fù)雜度是 O(n).

public class Solution {public int firstMissingPositive(int[] A) {int n = A.length;for(int i=0; i<n; i++){//此處看上去是兩層循環(huán),但是在尋找A[i] == i+1 的過(guò)程中,//不斷將A[i]放在A[A[i]-1]處,循環(huán)到A[i]-1的時(shí)候就不用再處理,所以整體是O(n)while(A[i] != i+1){if(A[i]<=0 || A[i]>n || A[i]==A[A[i]-1])break;else{//把A[i]放在A[i]-1處int temp = A[i];A[i] = A[temp-1];A[temp-1] = temp;}}}for(int i=0; i<n; i++){if(A[i] != i+1)return i+1;}return n+1;}
}

  

?

FirstMissingPositive問(wèn)題描述:給一個(gè)沒(méi)有排序的數(shù)組,找到第一個(gè)缺失的正數(shù),例如nums={1,2,0}return3,nums={3,4,-1,1}return2

算法分析:既然是找正數(shù),那么肯定是從1開(kāi)始的,那么我們把1放在nums[0],以此類推,我們把數(shù)組中每個(gè)元素都放在它應(yīng)該在的位置。那么找到下標(biāo)和數(shù)字不相符的元素,下標(biāo)+1即為缺失的正數(shù)。

?

public static int firstMissingPositive(int[] nums) {int i = 0;//將nums中每一個(gè)元素都放在它所代表的數(shù)字的位置上,例如nums[1]=4,那么nums[1]就應(yīng)該放在第四個(gè)位置上,也就是nums[1]=nums[nums[1]-1]//排除負(fù)數(shù)while(i < nums.length){if(nums[i] <= 0 || nums[i] > nums.length || nums[i] == i + 1 || nums[i] == nums[nums[i]-1]){i++;}else{int temp = nums[i];nums[i] = nums[temp - 1];nums[temp - 1] = temp;}}int j = 0;for(j = 0; j < nums.length; j ++){if(nums[j] != j + 1){return j+1;}}return j+1;}

  

?

《第一個(gè)缺失的正數(shù)》?http://www.cnblogs.com/masterlibin/p/5611822.html

《LeetCode112》  http://blog.csdn.net/javyzheng/article/details/40652409

《尋找第一個(gè)缺失數(shù)字》http://blog.csdn.net/lj_2_0_2/article/details/51336659

?

看完上述的3篇博文,總是有的地方考慮不清。直到看到一篇《【白話經(jīng)典算法系列之十六】“基數(shù)排序”之?dāng)?shù)組中缺失的數(shù)字》?http://blog.csdn.net/morewindows/article/details/12683723? 才豁然開(kāi)朗。

?

以{1, 3, 6, -100, 2}為例來(lái)簡(jiǎn)介這種解法:

從第一個(gè)數(shù)字開(kāi)始,由于a[0]=1,所以不用處理了。

第二個(gè)數(shù)字為3,因此放到第3個(gè)位置(下標(biāo)為2),交換a[1]和a[2],得到數(shù)組為{1, 6, 3, -100, 2}。由于6無(wú)法放入數(shù)組,所以直接跳過(guò)。

第三個(gè)數(shù)字是3,不用處理。

第四個(gè)數(shù)字是-100,也無(wú)法放入數(shù)組,直接跳過(guò)。

第五個(gè)數(shù)字是2,因此放到第2個(gè)位置(下標(biāo)為1),交換a[4]和a[1],得到數(shù)組為{1, 2, 3, -100, 6},由于6無(wú)法放入數(shù)組,所以直接跳過(guò)。
此時(shí)“基數(shù)排序”就完成了,然后再?gòu)谋闅v數(shù)組,如果對(duì)于某個(gè)位置上沒(méi)該數(shù),就說(shuō)明數(shù)組缺失了該數(shù)字。如{1, 2, 3, -100, 6}缺失的就為4。

這樣,通過(guò)第i個(gè)位置上就放i的“基數(shù)排序”就順利的搞定此題了。

 1 // 【白話經(jīng)典算法系列之十六】“基數(shù)排序”之?dāng)?shù)組中缺失的數(shù)字
 2 //  by MoreWindows( http://blog.csdn.net/MoreWindows ) 
 3 //  歡迎關(guān)注http://weibo.com/morewindows
 4 #include <stdio.h>
 5 void Swap(int &a, int &b)
 6 {
 7   int c = a;
 8   a = b;
 9   b = c;
10 }
11 int FindFirstNumberNotExistenceInArray(int a[], int n)
12 {
13   int i;
14   // 類似基數(shù)排序,當(dāng)a[i]>0且a[i]<N時(shí)保證a[i] == i + 1
15   for (i = 0; i < n; i++)
16     while (a[i] > 0 && a[i] <= n && a[i] != i + 1 && a[i] != a[a[i] - 1])
17         Swap(a[i], a[a[i] - 1]);
18   // 查看缺少哪個(gè)數(shù)
19   for (i = 0; i < n; i++)
20     if (a[i] != i + 1)
21       break;
22   return i + 1;
23 }
24 void PrintfArray(int a[], int n)  
25 {  
26   for (int i = 0; i < n; i++)  
27     printf("%d ", a[i]);  
28   putchar('\n');  
29 } 
30 int main()
31 {
32   printf("    【白話經(jīng)典算法系列之十六】“基數(shù)排序”之?dāng)?shù)組中缺失的數(shù)字\n");
33   printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n");
34   printf(" -- http://blog.csdn.net/morewindows/article/details/12683723 -- \n\n");
35 
36   const int MAXN = 5;
37   //int a[MAXN] = {1, 2, 3, 4, 7}; 
38   //int a[MAXN] = {1, 3, 5, 4, 2};
39   int a[MAXN] = {2, -100, 4, 1, 70};
40   //int a[MAXN] = {2, 2, 2, 2, 1};
41   PrintfArray(a, MAXN);
42   printf("該數(shù)組缺失的數(shù)字為%d\n", FindFirstNumberNotExistenceInArray(a, MAXN));
43   return 0;
44 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/dd2hm/p/7052969.html

總結(jié)

以上是生活随笔為你收集整理的第一个缺失数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。