1. 程式人生 > >27.動態規劃-區域與檢索(陣列不可變)-Leetcode 303(python)

27.動態規劃-區域與檢索(陣列不可變)-Leetcode 303(python)

  • 題目描述

給定一個整數陣列  nums,求出陣列從索引 到 j  (i ≤ j) 範圍內元素的總和,包含 i,  j 兩點。

  • 示例

給定 nums = [-2, 0, 3, -5, 2, -1],求和函式為 sumRange()

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

說明:

  1. 你可以假設陣列不可變。
  2. 會多次呼叫 sumRange
     方法。
  • 解決思路一

按我自己膚淺的想法呢,真的是沒想到這個題和動態規劃的關係到底是個啥,所以想到的是就是八竿子打不著的解決方案,不過也是學到了,可以用sum()函式來對List求和,把List做它的引數即可。

  • 程式碼一
class NumArray(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums

    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        return sum(self.nums[i:j+1])
  • 解決思路二

其實在區域求和的部分,是可以用到動態規劃的思想的,如果我們要求陣列中第i個元素到第j個元素的和,那麼如果我們一直維護著一個儲存從第1個元素到目前元素的和的陣列dp[n],那麼直接返回dp[j] - dp[i-1]即可

  • 程式碼二
class NumArray(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.dp = [0] *len(nums)
        sum = 0
        for i in range(len(nums)):
            sum += nums[i]
            self.dp[i] = sum

    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """
        if i == 0:
            return self.dp[j]
        else:
            return self.dp[j] - self.dp[i-1]
  • ps:雖然我沒用,但是參考的程式碼裡用到了python類、protected成員、私有成員的概念,還是很有用的,記一下。

_var ;變數名前一個下劃線來定義,此變數為保護成員protected,只有類及其子類可以訪問。此變數不能通過from XXX import xxx 匯入
__var;變數名前兩個下劃線來定義,此變數為私有private,只允許類本身訪問,連子類都不可以訪問。

class NumArray: 
    def __init__(self, nums): 
        """
        :type nums: List[int]
        """ 
        self.__dp = [0] * len(nums) 
        sums = 0 
        for i in range(len(nums)): 
            sums += nums[i] 
            self.__dp[i] = sums 
    def sumRange(self, i, j):
        """
        :type i: int
        :type j: int
        :rtype: int
        """ 
        if (i == 0): 
            return self.__dp[j] 
        else: 
            return self.__dp[j] - self.__dp[i - 1]