LintCode 139 [Subarray Sum Closest]

原題

給定一個整數數組,找到一個和最接近于零的子數組。返回第一個和最有一個指數。你的代碼應該返回滿足要求的子數組的起始位置和結束位置。

給出[-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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容