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)
最新評論