8.19 - hard - 66

327. Count of Range Sum

中午請人吃飯,結果吃多了,好困,有點坐不動了。這題有segment tree其實不是那么好做,答案的解釋一大堆,決定放到明天去理解。今天的任務是做到hard70,大概是可以完成的。

class Solution(object):
    def merge(self, arr1, arr2):
        r, i, j = [], 0, 0
        while i < len(arr1) and j < len(arr2):
            if arr1[i] < arr2[j]:
                r.append(arr1[i])
                i += 1
            else:
                r.append(arr2[j])
                j += 1
        r += arr1[i:] + arr2[j:]
        return r

    def count(self, prefix, start, end, lower, upper):
        if start >= end:
            return 0

        mid = start + (end - start + 1 >> 1)
        count = sum([
            self.count(prefix, s, e, lower, upper)
            for s, e in ((start, mid - 1), (mid, end))
        ])

        l, r = mid, mid
        for i in xrange(start, mid):
            while l <= end and prefix[l] - prefix[i] < lower:
                l += 1
            while r <= end and prefix[r] - prefix[i] <= upper:
                r += 1
            count += r - l

        prefix[start:end + 1] = self.merge(
            prefix[start:mid], prefix[mid:end + 1])

        return count

    def countRangeSum(self, nums, lower, upper):
        n = len(nums)

        prefix = [0] * (n + 1)
        for i, v in enumerate(nums, 1):
            prefix[i] = prefix[i - 1] + v

        return self.count(prefix, 0, n, lower, upper)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • what: 捧絲兒,挖掘演義明星,對接尋找明星的需求。 如果把藝人視作商品,那就類似于taobao。C2C 如果把...
    更上一層樓_再上一層樓閱讀 447評論 0 0
  • (1)this.props 表示那些一旦定義,就不再改變的特性,而 this.state 是會隨著用戶互動而產生變...
    西蘭花偉大炮閱讀 581評論 0 0
  • 如果說娛樂圈里最容易因戲生情的,宋慧喬應該是算一個了吧。不鳴則已,一鳴驚人,前段時間雙宋CP直接跳過曖昧、戀愛等直...
    zubay閱讀 613評論 0 0
  • 公司:杭州簡品食品股份有限公司 地址:杭州下沙經濟開發區益豐路55號 隊名:反省 隊呼:要每天反省 組員: 黃曉明...
    虛懷若江弟子閱讀 141評論 0 0