App下載

經(jīng)典Java面試題解析:最短路徑

耳機依賴患者 2023-07-11 09:13:31 瀏覽數(shù) (1346)
反饋

在Java的面試中,動態(tài)規(guī)劃是一個重要的算法主題。本文將介紹一道經(jīng)典的Java面試題——最短路徑,并提供詳細的解析和解題思路。

題目

給定一個包含非負整數(shù)的二維網(wǎng)格,找到從網(wǎng)格的左上角到右下角的最短路徑長度。每次只能向下或向右移動一步。

解析與解題思路

最短路徑是一個常見的動態(tài)規(guī)劃問題,我們可以使用動態(tài)規(guī)劃的思想來解決。

  1. 首先,讓我們定義一個二維狀態(tài)數(shù)組dp,其中dp[i][j]表示從起點到達網(wǎng)格的第i行第j列的最短路徑長度。
  2. 對于初始狀態(tài),我們將dp[0][0]設置為網(wǎng)格的起點值。然后,我們需要根據(jù)題目要求,將第一行和第一列的最短路徑長度進行初始化。對于第一行和第一列的網(wǎng)格元素,因為每次只能向下或向右移動一步,所以路徑長度就等于前一個網(wǎng)格元素的路徑長度加上當前網(wǎng)格元素的值。
  3. 接下來,我們從網(wǎng)格的第二行和第二列開始遍歷。對于每個網(wǎng)格元素grid[i][j],我們需要比較從上方網(wǎng)格dp[i-1][j]和左側(cè)網(wǎng)格dp[i][j-1]的最短路徑長度,并取較小值,然后加上當前網(wǎng)格元素的值。將得到的最小路徑長度賦給dp[i][j]。
  4. 在遍歷的過程中,我們不斷更新dp數(shù)組的值,確保它記錄的是每個網(wǎng)格位置的最短路徑長度。
  5. 最后,我們返回dp數(shù)組右下角元素dp[m-1][n-1],即為從起點到達終點的最短路徑長度。

以下是Java代碼實例:

public class MinimumPathSum {
    public static int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

        int[][] dp = new int[m][n];

        dp[0][0] = grid[0][0];

        // 初始化第一行和第一列
        for (int i = 1; i < m; i++) {
            dp[i][0] = dp[i-1][0] + grid[i][0];
        }

        for (int j = 1; j < n; j++) {
            dp[0][j] = dp[0][j-1] + grid[0][j];
        }

        // 更新dp數(shù)組的值
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
            }
        }

        return dp[m-1][n-1];
    }

    public static void main(String[] args) {
        int[][] grid = {
            {1, 3, 1},
            {1, 5, 1},
            {4, 2, 1}
        };

        int minPath = minPathSum(grid);
        System.out.println("最短路徑長度為:" + minPath);
    }
}

結(jié)論

通過動態(tài)規(guī)劃的思想,我們可以高效地解決最短路徑的問題。最短路徑是面試中常見的算法題目,掌握了解題思路和實現(xiàn)代碼,我們能夠在面試中更加自信地回答相關問題。

 學java,就到java編程獅!


0 人點贊