首頁>技術>

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)

3
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • vs2019專案除錯,提示HTTP錯誤403.14的解決方法