LeetCode No.303 Range Sum Query - Immutable | #Dynamic-programming #Array

Q:

Given an integer array nums, find the sum of the elements between indices i and j (ij), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3
Note:
You may assume that the array does not change. There are many calls to sumRange function.

public NumArray(int[] nums) {
}
public int sumRange(int i, int j) {
}
       // Your NumArray object will be instantiated and called as such:
       // NumArray numArray = new NumArray(nums);
       // numArray.sumRange(0, 1);
       // numArray.sumRange(1, 2);

}

注:求的是range內所有數的總和。

#A:

這個BF比較直觀子檀,但時間復雜度不是最優(yōu)。因為有個for loop峦树,所以時間復雜度是O(n)鸭叙。

Q:為什么這個會Time Limit Exceeded(超時)酝惧?
如果array里面數字少竟宋,算range sum其實還好逻卖,效率應該是不錯的吧!?但是如果數字大了叨吮,最極限的情況辆布,比如 `int[] test = new int[1000000];`那要是我們求`.sumRange(3茶鉴,999999)`锋玲,loop trace基本無限趨近于O(n)了。所以涵叮,放大測試惭蹂,就會發(fā)現問題。

private int[] data;

public NumArray(int[] nums) {
data = nums; //data is reference
}

public int sumRange(int i, int j) {
int sum = 0;
for (int k = i; k <= j; k++) { //這里有個for loop, 所以時間復雜度:O(n)
sum += data[k];
}
return sum;
}


這個最優(yōu)割粮,時間復雜度O(1)盾碗,空間復雜度O(n)

public class NumArray {
int[] nums;

public NumArray(int[] nums) {   //pre-caculation
    this.nums = nums;

    for(int i = 1; i < nums.length; i++)
        nums[i] += nums[i - 1];
}

public int sumRange(int i, int j) {
    if(i == 0)          //這個if判斷不能省略
        return nums[j];
    else
       return nums[j] - nums[i - 1];
}

}

思路同上,但加入dummy 0舀瓢,省去if判斷

private int[] sum;

public NumArray(int[] nums) {
sum = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
sum[i + 1] = sum[i] + nums[i];
}
}

public int sumRange(int i, int j) {
return sum[j + 1] - sum[i];
}


這個處理起來有點兒繞廷雅,要多declaration一個array。另外畢竟length不一樣京髓,要加1航缀。
優(yōu)點是不需要if判斷了爱只。原作者是這么解釋的:

>Notice in the code above we inserted a dummy 0 as the first element in the *sum* array. This trick saves us from an extra conditional check in *sumRange*function.
**Complexity analysis** :Time complexity : O(1)酬姆,Space complexity : O(n)
O(n) time pre-computation. Since the cumulative sum is cached, each *sumRange* query can be calculated in O(1).

----
LeetCode editorial solution approach #2

private Map<Pair<Integer, Integer>, Integer> map = new HashMap<>();

public NumArray(int[] nums) {
int sum = 0;

for (int i = 0; i < nums.length; i++) {
    for (int j = i; j < nums.length; j++) {
        sum += nums[j];
        map.put(Pair.create(i, j), sum);
    }
}

}

public int sumRange(int i, int j) {
return map.get(Pair.create(i, j));
}

用到了HashMap,~~還得自己定義對象Pair~~急迂,**map可以當做一個容器(裝載具有一定格式的數據)备图;pair可以理解為元素(放入到容器的的一個個個體)灿巧,發(fā)現pair并沒有單獨行動的典型用法赶袄,正常都是配合map來使用(即把pair這個元素插入到map這個容器里面)。pair 是 一種模版類型抠藕。每個pair 可以存儲兩個值饿肺。這兩種值無限制。也可以將自己寫的struct的對象放進去幢痘,去處理一對兒不同類型的值唬格。** LeetCode討論里家破,貌似有人說程序用不了颜说,可能是沒有自己定義Pair類,Java標準庫里沒有這個類汰聋,這個數據類型得自己定義一下才能用吧门粪。貌似C++可以直接用,除非是兩個值數據類型不同烹困,才得自己寫個struct玄妈。(這塊兒不是100%確定...):| `Map<Pair<Integer, Integer>, Integer>`,并且需要一個O(n^2)的pre-computation髓梅,因為要put數據到一個二維map里拟蜻。但是每個sumRange query的時間是O(1),HashTable的look up運行時長是個定值枯饿。

----
#Notes:
----

**好像**:當"pre-computation done in the constructor"酝锅,在考慮sumRange方法的query's time,計算這個方法(算法)的時間復雜度時奢方,pre- 部分可以不計入搔扁。

###Dynamic Programming(動態(tài)規(guī)劃):
- 線性動規(guī)
- 區(qū)域動規(guī)
- 樹形動規(guī)
- 背包問題
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蟋字,隨后出現的幾起案子稿蹲,更是在濱河造成了極大的恐慌,老刑警劉巖鹊奖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛聘,死亡現場離奇詭異,居然都是意外死亡忠聚,警方通過查閱死者的電腦和手機焰盗,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咒林,“玉大人熬拒,你說我怎么就攤上這事〉婢海” “怎么了澎粟?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵蛀序,是天一觀的道長。 經常有香客問我活烙,道長徐裸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任啸盏,我火速辦了婚禮重贺,結果婚禮上,老公的妹妹穿的比我還像新娘回懦。我一直安慰自己气笙,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布怯晕。 她就那樣靜靜地躺著潜圃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舟茶。 梳的紋絲不亂的頭發(fā)上谭期,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音吧凉,去河邊找鬼隧出。 笑死,一個胖子當著我的面吹牛阀捅,可吹牛的內容都是我干的胀瞪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼也搓,長吁一口氣:“原來是場噩夢啊……” “哼赏廓!你這毒婦竟也來了?” 一聲冷哼從身側響起傍妒,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤幔摸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颤练,有當地人在樹林里發(fā)現了一具尸體既忆,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年嗦玖,在試婚紗的時候發(fā)現自己被綠了患雇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宇挫,死狀恐怖苛吱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情器瘪,我是刑警寧澤翠储,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布绘雁,位于F島的核電站,受9級特大地震影響援所,放射性物質發(fā)生泄漏庐舟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一住拭、第九天 我趴在偏房一處隱蔽的房頂上張望挪略。 院中可真熱鬧,春花似錦滔岳、人聲如沸杠娱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墨辛。三九已至卓研,卻和暖如春趴俘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奏赘。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工寥闪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磨淌。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓疲憋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梁只。 傳聞我的和親對象是個殘疾皇子缚柳,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,743評論 0 33
  • @清晨 草葉上的露水 和尖頂上的鴿子一樣無知 假山里的圣母像 并非因為偷聽禱告而埋頭苦笑 講故事的人搪锣,一邊分享 一...
    塞茜爾閱讀 261評論 0 2
  • 每兩周幼兒園班主任都會在學生手冊上備注一些可可在校情況說明秋忙,我每次都會認真閱讀并注意他的那些行為習慣需要改進。很感...
    Sara_58a7閱讀 612評論 0 0