首頁>技術>

2021-03-24:給定一個整陣列成的無序陣列arr,值可能正、可能負、可能0。給定一個整數值K,找到arr的所有子數組裡,哪個子陣列的累加和等於K,並且是長度最大的。返回其長度。

福大大 答案2021-03-24:

我剛開始的想法,是對陣列的每一位加上一個值,把陣列全部變成非負數。比如[-5,3,1]變成[0,8,6]。可惜這種方法行不通,因為整數值K會變成不固定,還是沒法用雙指標。

求字首和,存map。

程式碼用golang編寫,程式碼如下:

package mainimport "fmt"func main() {    arr := []int{1, -1, 2, 3, -4, -1, 9}    ret := maxLength(arr, 9)    fmt.Println(ret)}func maxLength(arr []int, k int) int {    if len(arr) == 0 {        return 0    }    // key:字首和    // value : 0~value這個字首和是最早出現key這個值的    mmap := make(map[int]int)    mmap[0] = -1 // important    llen := 0    sum := 0    for i := 0; i < len(arr); i++ {        sum += arr[i]        if _, ok := mmap[sum-k]; ok {            llen = getMax(i-mmap[sum-k], llen)        }        if _, ok := mmap[sum]; !ok {            mmap[sum] = i        }    }    return llen}func getMax(a int, b int) int {    if a > b {        return a    } else {        return b    }}

執行結果如下:

***

[左神java程式碼](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class40/Code02_LongestSumSubArrayLength.java)

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 這12種方法輕鬆合併Python中的列表