演算法 分治演算法

2021-10-23 12:00:14 字數 1787 閱讀 5045

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...

演算法思想 分治演算法

分而治之 大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的乙個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問題的解合併...