1. 程式人生 > >【Leetcode】最接近和子陣列

【Leetcode】最接近和子陣列

給一個數組和k,找出一個子陣列,和最接近k,如果有多個返回任意一個。

當然n平方肯定可以解決,但是額外使用空間可以Onlogn。

思路還是用S(i)-S(j)的方式。

先計算出全部的s(i),然後存入map,key是sum,value是最後一個元素的位置。

接著再按照sum排序,然後遍歷一次sum,這是隻需要判斷前後連著的兩個sum只差即可,找出最接近k的。

下面是go程式碼:

package main

import (
	"fmt"
	"sort"
)

type P struct{
	sum, index int
}

type PList []*P

func (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 := 0
	list := PList{}
	p := new(P)
	p.sum = 0
	p.index = -1
	list=append(list, p)
	for i,v := range nums{
		sum += v
		p := new(P)
		p.sum = sum
		p.index = i
		list=append(list, p)
	}
	sort.Sort(list)
	min, f, b:= 1000000, 0, 0
	for i,v := range list{
		if i==0 {
			continue
		}
		cur := abs(v.sum - list[i-1].sum - k)
		if cur < min{
			min = cur
			f = list[i-1].index - 1
			b = list[i].index
		}
	}
	return f,b
}

func main() {
	array := []int{-3, 1, 1, -3, 5}
	k := 0
	f, b := subarraySum(array, k)
	fmt.Println(f, b)
}