題目
參考解法
從多數元素的定義我們可以知道,乙個陣列如果存在多數元素,那麼其多數元素只有乙個,並且這個元素出現的次數大於其長度的一半,而我們的方法就是遍歷陣列,檢視遍歷到的元素在陣列中的出現次數是否符合要求,如果符合,直接返回,不符合,則將這個元素(包括與這個元素值相等的元素)從陣列中刪除,遍歷剩餘的元素。參考**如下:
def
majorityelement
(nums:
list):
# 求出這個陣列長度的一半,多數元素出現的次數必須大於這個數
length_half =
len(nums)/2
# 定義乙個變數i,用來作為遍歷陣列的下標,開始遍歷
i =0# 當i小於陣列的長度時,遍歷。這裡陣列的長度每次都會計算一次。
while i <
len(nums)
:# 如果nums[i]滿足要求,則返回這個元素
if nums.count(nums[i]
)> length_half:
return nums[i]
# 如果不滿足要求,則將這個元素連同值等於他的元素全部刪除
else
: nums =
[j for j in nums if nums[j]
!=nums[i]
]
官方解法一:先排序,然後直接找出下標為len(nums)//2的元素。def
majorityelement
(nums:
list):
nums.sort(
)return nums[
len(nums)//2
]
官方解法二:用雜湊表統計每個元素出現的次數def
majorityelement
(nums:
list):
from collections import counter
counts = counter(nums)
return
max(
[counts.keys(
),key = counts.get]
)
官方解法三:boyer-moore 投票演算法
用乙個變數candidate來儲存眾數,預設為陣列第乙個值,用counts變數來統計,過程為如果counts為0,則將當前遍歷到的元素賦值給candidate;如果不為0,那麼如果當前元素等於candidate,則給counts加1,否則減1。
參考**
def
majorityelement
(nums:
list):
candidate =
0 counts =
0for i in nums:
if counts ==0:
candidate = i
counts = counts +(1
if i==candidate else-1
)return candidate
LeetCode每日一題 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 思路 先找出陣列nums中不同元素的數目,儲存在map中...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...