2021-03-09:在一個數組中,一個數左邊比它小的數的總和,叫數的小和,所有數的小和累加起來,叫陣列小和。求陣列小和。例子: [1,3,4,2,5],1左邊比1小的數:沒有,3左邊比3小的數:1,4左邊比4小的數:1、3,2左邊比2小的數:1,5左邊比5小的數:1、3、4、 2,所以陣列的小和為1+1+3+1+1+3+4+2=16 。
福哥答案2021-03-09:
1.歸併排序,從左往右,相等拷右。有程式碼。
2.歸併排序模板。有程式碼。
程式碼用golang編寫,程式碼如下:
```go
package main
import "fmt"
func main() {
if true {
arr := []int{1, 3, 4, 2, 5}
ret := smallSum1(arr)
fmt.Println("1.從左往右,相等拷右:", ret)
}
if true {
arr := []int{1, 3, 4, 2, 5}
ret := smallSum2(arr)
fmt.Println("2.歸併排序模板:", ret)
}
}
func smallSum1(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
return process1(arr, 0, arrLen-1)
}
func process1(arr []int, L int, R int) int {
curLen := R - L + 1
if curLen <= 1 {
return 0
}
//求中點
M := L + (R-L)>>1
return process1(arr, L, M) + process1(arr, M+1, R) + merge1(arr, L, M, R)
}
func merge1(arr []int, L int, M int, R int) int {
//輔助陣列
help := make([]int, R-L+1)
i := 0
p1 := L
p2 := M + 1
//誰小複製誰
ans := 0
for p1 <= M && p2 <= R {
if arr[p1] < arr[p2] {
ans += (R - p2 + 1) * arr[p1]
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
}
func smallSum2(arr []int) int {
arrLen := len(arr)
if arrLen <= 1 {
return 0
}
return process2(arr, 0, arrLen-1)
}
func process2(arr []int, L int, R int) int {
curLen := R - L + 1
if curLen <= 1 {
return 0
}
//求中點
M := L + (R-L)>>1
return process2(arr, L, M) + process2(arr, M+1, R) + merge2(arr, L, M, R)
}
func merge2(arr []int, L int, M int, R int) int {
//新增的程式碼
ans := 0
windowR := M + 1
for i := M; i >= L; i-- {
for windowR >= M+1 && arr[i] < arr[windowR] {
windowR--
}
ans += (R - windowR) * arr[i]
}
//輔助陣列
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
}
```
執行結果如下:
***
[左神java程式碼](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class04/Code02_SmallSum.java)