最小可用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...