最小可用ID(4種方法,詳細講解)

2021-10-03 03:22:36 字數 2440 閱讀 7879

最小可用id:在非負陣列(亂序)中找到最小的可分配的id(從1開始編號),資料量1000000

上面的陣列的最小可用id為1

這個陣列的最小可用id就為16

方法一:暴力解法------時間複雜度高o(n^2)

package smallid;

import com.sun.org.apache.xalan.internal.xsltc.compiler.util.util;

public

class

smallid

}//暴力解法o(n^2),從1開始依次探測每乙個自然數是否在陣列中

static

intfind1

(int

arr)

i++;//若不是,繼續迴圈}}

}

方法二:快速排序,讓陣列變得有序後找出缺少的數------時間複雜度o(nlogn)

package smallid;

public

class

smallidk

intfind2

(int

arr)

i++;//否則,繼續迴圈

}return i+1;}}}

方法三:利用輔助陣列進行掃瞄-------時間複雜度o(n)

輔助空間的陣列下標表示該下標元素出現的次數

偽**

helper=

[a.length]

for(i:0..

...a.length-1)

helper[a[i]-1

=1;//下標轉為數字

}for

(i:0...

...a.length-

1//掃瞄輔助空間

if(helper[i]==0

)//若help的下標沒有係數為1

return i+1;

}return a.length+

1;

**

package smallid;

import com.sun.org.apache.xalan.internal.xsltc.compiler.util.util;

public

class

smallid2

for(

int i=

1;i<=n;i++)}

return n+1;

//若陣列長度範圍內度存在,則返回n+1

}public

static

void

main

(string[

] args)

;long now=system.

currenttimemillis()

; object find2;

smallidk find2=

newsmallidk()

; system.out.

println

(find2

(arr));

util.

duration

(now);

now=system.

currenttimemillis()

; system.out.

println

(find3

(arr));

util.

duration

(now);}

}

方法四:區間分割法

假設乙個長度為100的陣列

分為以下三種情況;

1.中間值恰好為50時,表明陣列左半區間數字元素緊湊,沒有要找的缺少元素

2.中間值為大於50的值,表明陣列左半區間有漏掉的元素

package smallid;

public

class

smallidfenqu

else

}public

static

void

main

(string[

] args)

; arr=

newint

[1000

*1000];

}}

最小可用ID

描述 在非負數 亂序 中找到最小的可分配的id 從1開始編號 資料量1000000 輸入 第一行 陣列長度 第二行 陣列元素 輸出整數 樣例輸入 5 3 2 1 4 5 7 8 9 樣例輸出 解題思路 首先分析題幹在亂序陣列中尋找那個空缺的數 解法一 暴力迴圈o n 2 static intf in...

最小可用id和bitmap演算法

18,4,8,9,16,1,14,7,19,3,0,5,2,11,6 比如這個列表,很明顯,最小可用id為10 最簡單的演算法也異常簡單,就是1 18每個數都進行一次遍歷,找到為止,但是效能也可想而知的非常差 我們進行第一步優化 就是將這些id,第一次遍歷後進行一次索引,然後再查詢起來就非常簡單了 ...

id4 使用 password 授權

1 新增 client 設定clientid,新增client金鑰,設定授權型別為 passwrod 設定允許訪問的scope 作用域 至少新增 openid 不然 無法呼叫 userinfo 端點,也應該至少新增乙個 api 資源關聯的 scope,不然請求到的 token只能訪問 identit...