先說一種只要上過高中就寫的出的最直觀的方法,我稱之為排列組合法`
for
(int i =
0; i < arr.length; i++
)}
方法是很直觀,但是時間卻需要花費n^2的個數積。我不同意!
於是我們就可以往分治的方向想:打個比方,小學的時候老師要求選出全班10個男生力氣最大的他絕對不會用排列組合的方法確保每個人都比過一次,而是會讓同學兩兩相比,最後選出優勝者再兩兩相比
那麼我們是不是可以這樣想:假設arr有10個元素那麼和要求值r最接近的要不在整段的arr【0—9】的中間部分要不就在左邊arr【0-4】要不就在右邊arr【5-9】而左邊陣列arr【0-4】的最佳值也如此要不是本段中間部分要不在左邊arr【0-2】…
直到分為最小的子元素這個時候你講順序倒過來看那麼就變成了
那麼話不多說最後上**
public
static
intcompete
(int a,
int b,
int c,
int p)
if(result>math.
abs(c-p)
)return r;
}`
public
static
intdivide
(int
arr,
int l,
int u,
int r)
if(l+
1==u)
return
(compete
(arr[l]
, arr[u]
, arr[u]
+arr[l]
, r));
int m=
(l+u)/2
;int t1=0;
int t2=1;
int suit=
-10000
;int sum=0;
while
((m-t1)
==l&&
(m+t2)
==u)
elseif(
(m+t2)
==u)if(
(m-t1)
==l&&
(m+t2)
==u)
break;if
(math.
abs(sum+arr[m-t1]
-r)>math.
abs(sum+arr[m+t2]
-r))
else
}return
compete
(suit,
divide
(arr, l, m,r)
,divide
(arr, m+
1, u,r)
,r);
}
public
static
void
main
(string[
] args)
;int r=scan.
nextint()
;
system.out.
println
(divide
(arr,
0, arr.length-
1,r));
}
演算法 分治演算法
分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...
演算法 分治演算法
leetcode 169.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...
演算法複習 分治演算法
先來看乙個經典的二分查詢例子。int binarysearch vector nums,int target return 1 時間複雜度是 o logn 我們看到,二分查詢貫徹了分治的思想。當我們要解決乙個輸入規模較大 不妨設為 n 的問題時,可以將這個問題分解成 k 個不同的子集,如果能得到 k...