App下載

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

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

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

題目

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

解析與解題思路

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

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

以下是Java代碼實(shí)例:

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é)論

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

 學(xué)java,就到java編程獅!


0 人點(diǎn)贊