本文主要是介绍【Leetcode】最接近和子数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这次是Lintcode的题目:http://www.lintcode.com/zh-cn/problem/subarray-sum-closest/
给一个数组和k,找出一个子数组,和最接近k,如果有多个返回任意一个。
当然n平方肯定可以解决,但是额外使用空间可以Onlogn。
思路还是用S(i)-S(j)的方式。
先计算出全部的s(i),然后存入map,key是sum,value是最后一个元素的位置。
接着再按照sum排序,然后遍历一次sum,这是只需要判断前后连着的两个sum只差即可,找出最接近k的。
下面是go代码:
package mainimport ("fmt""sort"
)type P struct{sum, index int
}type PList []*Pfunc (list PList) Len() int{return len(list)
}func (list PList) Less(i, j int) bool{return list[i].sum < list[j].sum
}func (list PList) Swap(i, j int){list[i], list[j] = list[j], list[i]
}func abs(x int) int{if x >= 0{return x}return -x
}func subarraySum(nums []int, k int) (int, int) {sum := 0list := PList{}p := new(P)p.sum = 0p.index = -1list=append(list, p)for i,v := range nums{sum += vp := new(P)p.sum = sump.index = ilist=append(list, p)}sort.Sort(list)min, f, b:= 1000000, 0, 0for i,v := range list{if i==0 {continue}cur := abs(v.sum - list[i-1].sum - k)if cur < min{min = curf = list[i-1].index - 1b = list[i].index}}return f,b
}func main() {array := []int{-3, 1, 1, -3, 5}k := 0f, b := subarraySum(array, k)fmt.Println(f, b)
}
这篇关于【Leetcode】最接近和子数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!