題目:https://leetcode.com/problems/insert-delete-getrandom-o1/
描述:實作RandomizedSet
類別,其中的函式要能新增&刪除數字以及隨機回傳一個數字,所有函式的平均時間複雜度需要是O(1)
,所有存入的數字都不重複
解題思路:題目時間複雜度要求所有操作都要是平均O(1)
,使用HashMap或HashSet的增減、查詢都是O(1),但隨機取出元素需要用到iterator所以是O(n),相對的用陣列就能O(1)時間隨機取出元素
因此我們混用2個資料結構,使用HashMap來紀錄數字在陣列中的位置,使用陣列紀錄&隨機取出元素,並且增減時都只在陣列最尾端操作以保證增減元素也是O(1)
程式碼:
class RandomizedSet {
private List<Integer> set;
private HashMap<Integer, Integer> index;
private Random rand;
public RandomizedSet() {
set = new ArrayList<>();
index = new HashMap<>();
rand = new Random();
}
public boolean insert(int val) {
//val已在set中不用新增,回傳false
if(index.containsKey(val)) return false;
//val不在set中,把val加到set的最後一格,並將對應的位置存進map中
index.put(val, set.size());
set.add(val);
return true;
}
public boolean remove(int val) {
//val不在set中不用刪除,回傳false
if(!index.containsKey(val)) return false;
//val在set中,首先從map抓出val的位置
int loc = index.get(val);
//如果val的位置不是在set的最後位,找出set最後位的數字並把他移到val的位置
if(loc < set.size()-1) {
int lastOne = set.get(set.size()-1);
index.put(lastOne, loc);
set.set(loc, lastOne);
}
//最後移除set最後位的資料,並從map中移除val的資料
index.remove(val);
set.remove(set.size()-1);
return true;
}
public int getRandom() {
return set.get(rand.nextInt(set.size()));
}
}
時間複雜度:O(1)
空間複雜度:O(n)
leetcode
medium
map/set
array
題目:https://leetcode.com/problems/power-of-four/description/ 描述:判斷輸入的數字是否為4的次方數 解題思路:標準解法是使用對數基底變換方法,不過這題也可以看作判斷是否為2的次方數的延伸題,4的次方數跟2的次方數一樣用二進位制表示只會有1個位元為1,不過這次這些1只會出現在奇數位上,額外再用一個mask來判斷1是否出現在奇數位即可 程式碼: class Solution { public boolean isPowerOfFour(int n) {
Dec 7, 2022題目:https://leetcode.com/problems/power-of-three/description/ 描述:判斷輸入的數字是否為3的次方數 解題思路(1):用對數的基底變換計算,如果i = log10(n) / log10(3)的i為整數的話代表n為3的次方數 程式碼: class Solution { public boolean isPowerOfThree(int n) {
Dec 7, 2022題目:https://leetcode.com/problems/power-of-two/description/ 描述:判斷輸入的數字是否是2的n次方數 解題思路:有個方法能快速找出正整數n是否為2的n次方數/只有一個位元為1:將n與n-1進行位元AND運算,結果為0則n即為2的n次方數/只有一個位元為1 程式碼: class Solution { public boolean isPowerOfTwo(int n) {
Dec 6, 2022題目:https://leetcode.com/problems/reverse-bits/ 描述:將32位元的unsigned int中的位元順序顛倒後回傳結果的值 解題思路:詳細解答來源,用分治法(divide and conquer)每次將處理範圍中左半與右半邊的位元值互換,對一個有2^n位元的數字總共只需要換n次即可 程式碼: public class Solution { // you need treat n as an unsigned value
Nov 30, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up