【Leetcode】最接近和子数组
来源:互联网 发布:淘宝进口商品资质 编辑:程序博客网 时间:2024/06/07 16:07
这次是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)}
阅读全文
0 0
- 【Leetcode】最接近和子数组
- leetcode-最接近0的子数组和
- 求子数组和最接近0
- 子数组的和与0最接近
- LintCode-最接近零的子数组和
- 最接近零的子数组和_LintCode
- LintCode:最接近零的子数组和
- 最接近给定值的子数组和
- 最接近零的子数组和
- 最接近零的子数组和
- LintCode 最接近零的子数组和
- 求给定数组子数组中最接近0的和
- 双核问题-子数组和最接近数组总和一半
- 求子数组的和最接近特定值
- lintcode(139)最接近零的子数组和
- 求一个无序数组的子数组, 子数组的和最接近0
- 将数组划分为两个元素和最接近的子数组
- 2N的数组分割成两个和最接近的子数组
- C++动态内存管理
- python中线程和进程
- 51Nod 1186 质数检测 V2
- 浙江大学精品课程视频合集
- CCF-20160901-最大波动(100分)
- 【Leetcode】最接近和子数组
- UVa11404
- 如何选择自动化安装默认文件
- 如何写一个简单的jQuery插件
- 将关键代码手动移植到C语言
- Python循环嵌套应用案例一则:判断丑数
- Word2vec 计算两个文本之间相似度
- java 中 JDBC 连接数据库操作
- 73. Set Matrix Zeroes