LeetCode第169題解析

2021-10-08 16:14:01 字數 1259 閱讀 5888

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於⌊ n/2 ⌋的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

示例 1:

輸入: [3,2,3]

輸出: 3

示例 2:

輸入: [2,2,1,1,1,2,2]

輸出: 2

解法一:排序,排序之後,處於中間位置的必然是眾數。複雜度為nlogn。

class solution 

};

解法二:用雜湊表來進行輸出。

class solution 

return 0;

}};

解法三:用moore投票法

class solution 

return candidate;

}};

解法四:用分治的方法

思路如果數 a 是陣列 nums 的眾數,如果我們將 nums 分成兩部分,那麼 a 必定是至少一部分的眾數。

我們可以使用反證法來證明這個結論。假設 a 既不是左半部分的眾數,也不是右半部分的眾數,那麼 a 出現的次數少於 l / 2 + r / 2 次,其中 l 和 r 分別是左半部分和右半部分的長度。由於 l / 2 + r / 2 <= (l + r) / 2,說明 a 也不是陣列 nums 的眾數,因此出現了矛盾。所以這個結論是正確的。

這樣以來,我們就可以使用分治法解決這個問題:將陣列分成左右兩部分,分別求出左半部分的眾數 a1 以及右半部分的眾數 a2,隨後在 a1 和 a2 中選出正確的眾數。

演算法我們使用經典的分治演算法遞迴求解,直到所有的子問題都是長度為 1 的陣列。長度為 1 的子陣列中唯一的數顯然是眾數,直接返回即可。如果回溯後某區間的長度大於 1,我們必須將左右子區間的值合併。如果它們的眾數相同,那麼顯然這一段區間的眾數是它們相同的值。否則,我們需要比較兩個眾數在整個區間內出現的次數來決定該區間的眾數。

class solution 

int majority_element_rec(vector& nums, int lo, int hi)

public:

int majorityelement(vector& nums)

};

LeetCode第146題解析

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果關鍵字 key 存在於快取中,則獲取關鍵字的值 總是正數 否則返回 1。寫入資料 put key,value 如果關鍵字已經存在,則變更其...

LeetCode第15題解析

給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class so...

LeetCode第641題解析

設計實現雙端佇列。你的實現需要支援以下操作 mycirculardeque k 建構函式,雙端佇列的大小為k。insertfront 將乙個元素新增到雙端佇列頭部。如果操作成功返回 true。insertlast 將乙個元素新增到雙端佇列尾部。如果操作成功返回 true。deletefront 從雙...