陣列不相鄰元素之和的最大值

2022-08-23 16:15:11 字數 1080 閱讀 5398

今天下午面試老虎**,被問到這題,當時腦子有點蒙,**沒寫出來。這題的意思就是給你乙個陣列,讓你計算元素的和,但是這些元素都不能相鄰,求最大的和。其實這題很常見,在leetcode上面也有,但是原題是這樣的:

假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的情況下。

例如:

陣列arr為[1, 3, 5, 4, 9],那麼結果為 1 + 5 + 9 = 15,再例如陣列arr為[5, 1, 3, 11, 7],那麼結果為5 + 11 = 16,從這兩個例子可以看出,單純的計算奇數字的和或者偶數字的和得到的結果未必是最大的。

解題思路

定義乙個陣列p,p[i] 代表從第0到第i個房屋,打劫第i個房屋為止所獲得金錢總額,也就是說第i個房屋要打劫,而p[i]肯定等於arr[i] + p[i-2]或者arr[i] + p[i-3]的最大值,因為相鄰的房屋不能打劫,所以p[i-1]不能算。最後我們只要計算p[arr.length-1]和p[arr.length-2]哪個大就行了。p[arr.length-3]肯定不是最大的,因為p[arr.length-3] + arr[arr.length-1]肯定比p[arr.length-3]大。

public

static

int getmaxsum(int

arr)

return math.max(p[arr.length-1],p[arr.length-2]);

}

其實這題還能優化為o(1)的空間,從上面的**分析,在計算打劫第i個房屋的收益的時候,其實只是和打劫前面3個房屋的收益有關,我們完全可以定義4個變數來表示。

public

static

int getmaxsum2(int

arr)

return

math.max(m3, m2);

}

元素互不相鄰的最大和子陣列

對於乙個給定的陣列,在其中選取其子陣列,要求相鄰的元素不能選取,且要保證選出的子陣列元素和最大。輸入陣列長度及其元素,輸出所選子陣列的和。測試輸入 7 4 2 6 1 3 5 8 測試輸出 21dp i 代表到截至第i項的最大和 可能不包括第i項 分析 對於任何乙個dp問題,其都牽扯到選與不選某個元...

子陣列之和的最大值

給定乙個陣列,查詢這個陣列的子陣列的最大和 比如 2,5,3,6,4,8,6 輸出最大和8 分析 假設已經找到乙個子陣列的最大和,這個子陣列是從陣列索引i到索引j。可以用如下式子描述,cur max a i j 對於下乙個數,也就是索引為j 1,這個最大和是否 將a j 1 加入cur max,需要...

子陣列之和的最大值

感謝firo july 2010.06.05。algorithm 1 時間效率為o n n n intmaxsubsequencesum1 const inta,intn return maxsum algorithm 2 時間效率為o n n intmaxsubsequencesum2 const...