数组中左边数大于二倍右边数的总个数
arr:[6,4,2,1]
其中(6,2)(6,1)(4,1)这3个组合是满足左边数大于右边数的两倍
func biggerTwice(arr []int) int {
if arr == nil || len(arr) < 2 {
return 0
}
return processBigger(arr, 0, len(arr) - 1)
}
func processBigger(arr []int, l, r int) int {
if l == r {
return 0
}
// l < r
mid := l + (r - l) >> 1
return processBigger(arr,l,mid) +
processBigger(arr,mid + 1, r)+
mergeBigger(arr,l,mid,r)
}
func mergeBigger(arr []int,L,m,r int) int {
// [L....M] [M+1....R]
ans := 0
// 目前囊括进来的数,是从[M+1, windowR)
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, p1, p2 := 0, L, 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]
i++
p1++
}
for p2 <= r {
help[i] = arr[p2]
i++
p2++
}
for j := 0; j < len(help); j++ {
arr[L + j] = help[j]
}
return ans
}
func TestBiggerTwice(t *testing.T) {
arr := []int{6,4,2,1}
t.Log(biggerTwice(arr))
}