27.動態規劃-區域與檢索(陣列不可變)-Leetcode 303(python)
阿新 • • 發佈:2018-12-05
- 題目描述
給定一個整數陣列 nums,求出陣列從索引 i 到 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
說明:
- 你可以假設陣列不可變。
- 會多次呼叫 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]