2021-03-07:在一個數組中,對於每一個數num,求有多少個後面的數 * 2 依然<num,求總個數。好比:[3,1,7,0,2],3的後面有:1,0;1的後面有:0;7的後面有:0,2;0的後面沒有;2的後面沒有;因此總共有5個。
福哥答案2021-03-07:java
歸併排序模板。有代碼。git
代碼用golang編寫,代碼以下:github
package main import "fmt" func main() { arr := []int{3, 1, 7, 0, 2} ret := BiggerTwice(arr) fmt.Println(ret) } func BiggerTwice(arr []int) int { arrLen := len(arr) if arrLen <= 1 { return 0 } return process(arr, 0, arrLen-1) } func process(arr []int, L int, R int) int { curLen := R - L + 1 if curLen <= 1 { return 0 } //求中點 M := L + (R-L)>>1 return process(arr, L, M) + process(arr, M+1, R) + merge(arr, L, M, R) } func merge(arr []int, L int, M int, R int) int { //新增的代碼 ans := 0 windowR := M + 1 for i := L; i <= M; i++ { for windowR <= R && (arr[i] > arr[windowR]*2) { windowR++ } ans += windowR - M - 1 } //輔助數組 help := make([]int, R-L+1) i := 0 p1 := L p2 := M + 1 //誰小拷貝誰 for p1 <= M && p2 <= R { if arr[p1] <= arr[p2] { help[i] = arr[p1] p1++ } else { help[i] = arr[p2] p2++ } i++ } for p1 <= M { help[i] = arr[p1] p1++ i++ } for p2 <= R { help[i] = arr[p2] p2++ i++ } //輔助數組拷貝到原數組 copy(arr[L:R+1], help) return ans }
執行結果以下:golang