九章演算法 Google面試題 內積

2021-10-18 03:51:21 字數 1306 閱讀 2253

描述

給定長度為n的a陣列,長度為k的b陣列

你可以從a陣列裡取k個數

規則如下:

即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除

將取出的ai按取出的順序組成c陣列

求b與c的內積最大值

b與c內積為∑i=0k−1bi×ci

解釋1:

a= [1,4,3,2,5]

b=[1,2,3,4]

k=4

取出a0 ,

c=[1]

取出a4

c=[1,5]

取出a1

c=[1,5,4]

取出a2

c=[1,5,4,3]

b·c=1*1+2*5+3*4+4*3=35

這只是c的一種可行方案,可能不是最優方案

解釋2

a=[1,2,3,4]

不能直接取出

a1 因為

a0和a2都沒有取出

lintcode 領扣

樣例

[2,3,5,1] 

[2,1]

取出a0,a1

演算法dp

dp方程 dpijdpij表示從左邊取了i個數,從右邊取了j個數的最大內積

dp方程轉移

即判斷上一次從左邊取還是從右邊取數哪個內積更大

dp邊界條件 dp00=0dp00=0 兩邊都沒取數 內積為0

答案 ans=max(ans,dpik−i)ans=max(ans,dpik−i) 即列舉左邊取了多少個數,答案取dp陣列最大值

複雜度分析

public

class

solutionif(

i+j>n)

//dp陣列邊界條件,從左右都不取數的時候,dp[0][0]=0 if(

i==0&&

j==0)

//從左邊取的i 更新dp[i][j] if(

i!=0)

//從右邊取的j,更新dp[i][j] if(

j!=0)

}}//列舉從左邊取了多少,找最大的內積

long

ans=0;

for(

inti=0

;i<=k;

i++)

return

ans;

}}

更多題解參考:九章演算法

九章演算法 Google 面試題 解碼方法

有乙個訊息包含 a z 通過以下規則編碼 a 1 b 2 z 26 現在給你乙個加密過後的訊息,問有幾種解碼的方式 樣例 1 輸入 12 輸出 2 解釋 它可以被解碼為 ab 1 2 或 l 12 樣例 2 輸入 10 輸出 1 演算法 動態規劃 dp 演算法思路 思路 複雜度分析 n表示字串長度 ...

九章演算法 Google面試題 島嶼的個數II

給定 n,m,分別代表乙個二維矩陣的行數和列數,並給定乙個大小為 k 的二元陣列a.初始二維矩陣全0.二元陣列a內的k個元素代表k次操作,設第i個元素為 a i x,a i y 表示把二維矩陣中下標為a i x行a i y列的元素由海洋變為島嶼.問在每次操作之後,二維矩陣中島嶼的數量.你需要返回乙個...

九章演算法 Google 面試題 奇怪的印表機

作者 陳近南 專欄 九章演算法 乙個奇怪的印表機列印時遵守以下兩個特殊的條件 每次只能列印同乙個字元組成的連續序列。每次列印可以在任何位置開始,在任何位置結束,列印的字元會將原來已有的字元覆蓋。給定乙個只包含小寫字母的字串,你的任務是計算用該印表機列印出這個字串所需的最少列印次數。字串長度不超過10...