原題
給定一個整數數組,找到一個和最接近于零的子數組。返回第一個和最有一個指數。你的代碼應該返回滿足要求的子數組的起始位置和結束位置。
給出[-3, 1, 1, -3, 5],返回[0, 2],[1, 3],[1, 1],[2, 2]或者[0, 4]
O(nlogn)的時間復雜度
解題思路
- 首先建立一個pair類,便于記錄前n項和與對應的index。因為后面要對sum數組排序,結果又要返回index
- loop一遍有序的sum數組,維護一個Closest變量,有更小的就更新
完整代碼
class Pair:
def __init__(self, sum, index):
self.sum = sum
self.index = index
class Solution:
"""
@param nums: A list of integers
@return: A list of integers includes the index of the first number
and the index of the last number
"""
def subarraySumClosest(self, nums):
res = []
if not nums:
return res
length = len(nums)
if length == 1:
return [0, 0]
sums = [Pair(0, 0)]
prev = 0
for i in range(1, length + 1):
sums.append(Pair(prev + nums[i - 1], i))
prev = sums[i].sum
sums = sorted(sums, key=lambda pair : pair.sum)
Closest = sys.maxint
for i in range(1, length + 1):
if Closest > sums[i].sum - sums[i - 1].sum:
Closest = sums[i].sum - sums[i - 1].sum
res = []
tmp = [sums[i].index - 1, sums[i - 1].index - 1]
tmp.sort()
res.append(tmp[0] + 1)
res.append(tmp[1])
return res