演算法面試題 美團校招題(拜訪)

2022-03-29 03:37:42 字數 1582 閱讀 3320

題目很簡單,注意方向只能選左右中的乙個和上下中的乙個,既然要走到目的地,那麼方向已經決定了,就是盡量靠近目的地。

分析:紅色的圈表示起點,紅色三角形表示終點。這裡如果向上走或者向右走,那麼永遠到不了終點,所以路徑只會在兩個點構成的矩形中,並且方向只有兩個。

按照上圖,假設向左走,走一步到綠色圈的位置,或者向下走一步到藍色的圈的位置(這裡暫時假設沒有障礙),對於這兩種走法,都會形成乙個新的移動矩形(用不同顏色表示),子問題的解組成原問題的解,動態規劃。

設水平和垂直移動方向分別為v(左移為-1,右移為1,有障礙為0)和h,從起點座標(x,y)到終點座標(desx,desy)的方案數為f(x,y),則有下面狀態轉移方程:

有了這個,**就很容易了:

1

public

int countpath(int map, int n, int

m) 11

if (map[i][j] == 2) 15}

16}17if (desx == x) 22}

23return 1;24}

25if (desy ==y) 30}

31return 1;32}

33 horizontal = desx - x > 0 ? 1 : -1; //

確定水平方向

34 vertical = desy - y > 0 ? 1 : -1; //

確定垂直方向

35int ver = new

int[map.length];

36for (int i = 0; i < ver.length; i++)

39 ver[x][y] = 0;

40 ver[x + vertical][y] = 1;

41int hor = new

int[map.length];

42for (int i = 0; i < hor.length; i++)

45 hor[x][y] = 0;

46 hor[x][y + horizontal] = 1;

47if (map[x + vertical][y] == -1)

50if (map[x][y + horizontal] == -1)

53return countpath(ver, n, m) + countpath(hor, n, m); //

如果方向沒限制,則結果為水平走和垂直的和

54 }

因為要把移動了之後的陣列傳入遞迴方法,所以需要對陣列進行clone操作,這裡不能直接對二維陣列進行clone操作,需要通過for迴圈逐層拷貝,否則會因為引用相同而使得ver和hor陣列的內容相同。

2016美團校招真題 二維陣列列印

有乙個二維陣列 n n 寫程式實現從右上角到左下角沿主對角線方向列印。給定乙個二位陣列arr及題目中的引數n,請返回結果陣列。測試樣例 1,2,3,4 5,6,7,8 9,10,11,12 13,14,15,16 4 返回 4,3,8,2,7,12,1,6,11,16,5,10,15,9,14,13...

面試題 美團面試準備

重要原題 執行緒池原理 引數,執行緒是如何維持住的 ftp http埠號 http狀態碼,502和504的區別 http請求到相應的全過程 泛型的原理 類載入器原理 mybatis為什麼區分不同的標籤 aqs常用垃圾 器以及如何選擇?如何解決full gc問題 四則運算器 阿拉伯數字轉漢字 二叉樹節...

校招經典面試題

作業系統 執行緒同步的方式有哪些 程序的通訊方式有哪些 什麼是緩衝區溢位?有什麼危害?造成的原因是什麼 什麼是死鎖?死鎖產生的條件?解決死鎖的方法?解決方法 程序有哪幾種狀態?程序排程策略有哪幾種?為什麼在儲存中引入虛擬儲存器 核心的作用 使用者態和核心態 資料結構和演算法 有哪些常見的資料結構 常...