leetcode 169.多數元素
應用舉例
通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中
卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。
相關概念:
一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序度。
方法1方法2
題目描述:
示例 1:輸入: [3,2,3]
輸出: 3
示例 2:方法一:利用集合,輸入: [2,2,1,1,1,2,2]
輸出: 2
map
中存放的元素是不重複的,考慮使用map
記錄陣列中元素出現的次數,此方法選擇map
介面的實現類hashmap
,通過呼叫hashmap
的方法來解決問題,key
代表元素,value
代表元素出現的次數,用方法countnums
來記錄每個元素出現的次數,之後遍歷entryset
選出出現次數做多的key
即為眾數。
**實現:
class
solution
else
}return counts;
}public
intmajorityelement
(int
nums)
}return majorityentry.
getkey()
;}}
方法二:分治法
**實現
class
solution
}return count;
}private
intmajorityelementrec
(int
nums,
int low,
int high)
// recurse on left and right halves of this slice.
int mid =
(high-low)/2
+ low;
int left =
majorityelementrec
(nums, low, mid)
;int right =
majorityelementrec
(nums, mid+
1, high)
;// if the two halves agree on the majority element, return it.
if(left == right)
// otherwise, count each element and return the "winner".
int leftcount =
countinrange
(nums, left, low, high)
;int rightcount =
countinrange
(nums, right, low, high)
;return leftcount > rightcount ? left : right;
}public
intmajorityelement
(int
nums)
}
演算法 分治演算法
分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...
演算法複習 分治演算法
先來看乙個經典的二分查詢例子。int binarysearch vector nums,int target return 1 時間複雜度是 o logn 我們看到,二分查詢貫徹了分治的思想。當我們要解決乙個輸入規模較大 不妨設為 n 的問題時,可以將這個問題分解成 k 個不同的子集,如果能得到 k...
演算法思想 分治演算法
分而治之 大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的乙個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問題的解合併...