1、漢諾塔問題。列印n層漢諾塔從最左邊移動到最右邊的全部過程。
public static void main(string args)
public static void method(int n, string from, string to, string help)
method(n - 1, from, help, to);
system.out.println("move " + n + " from " + from + " to " + to);
method(n - 1, help, to, from);
}
move 1 from 左 to 右
move 2 from 左 to 中
move 1 from 右 to 中
move 3 from 左 to 右
move 1 from 中 to 左
move 2 from 中 to 右
move 1 from 左 to 右
2、列印乙個字串的全部子串行,包括空字串。
public static void method(string string)
public static void method(string string, string res, int index)
//拼接當前index字元
method(string, res + string.charat(index), index + 1);
//不拼接當前index字元
method(string, res, index + 1);
}
3、列印乙個字串的全排列。
public static void method(string string)
public static void method(char chars, int index)
//依次將index位置的數值設為後面的每乙個數
for (int i = index; i < chars.length; i++)
}public static void swap(char chars, int i, int j)
4、列印乙個字串的全部排列,要求不要出現重複的排列。1)、加乙個set去重。。
public static void method(string string)
public static void method(char chars, int index, hashsetset)
return;
}for (int i = index; i < chars.length; i++)
swap(chars, index, i);
method(chars, index + 1, set);
swap(chars, index, i);}}
public static void swap(char chars, int i, int j)
2)、還沒想好。。
5、給你乙個二維陣列,二維陣列中的每個數都是正數,要求從左上角走到右下角,每一步只能向右或者向下。沿途經過的數字要累加起來。返回最小的路徑和。
思路:1)、從左上到右下,可以右移或下移,暴力遞迴列舉所有的路徑,取最小的。
public static void method(int arr)
public static int method(int arr, int i, int j)
if (i == arr.length - 1)
if (j == arr[0].length - 1)
return math.min(arr[i][j] + method(arr, i, j + 1), arr[i][j] + method(arr, i + 1, j));
}
2)、動態規劃從右下角開始,每個數到右下角的最短路徑取決於當前數右邊的數和下邊的數。
public static int method2(int arr, int m, int n)
if (i == tr)
if (j == td)
dp[i][j] = math.min(dp[i][j + 1], dp[i + 1][j]) + arr[i][j];}}
return dp[m][n];
}
6、給你乙個陣列arr,和乙個整數aim。如果可以任意選擇arr中的數字,能不能累加得到aim,返回true或者false1、遞迴列舉
public static boolean method(int arr, int aim)
public static boolean method(int arr, int aim, int index, int res)
return false;
}return method(arr, aim, index + 1, res + arr[index]) || method(arr, aim, index + 1, res);}}
6、摺紙問題: 請把一段紙條豎著放在桌子上,然後從紙條的下邊向上方對折1次,壓出摺痕後展開。此時 摺痕是凹下去的,即摺痕突起的方向指向紙條的背面。如果從紙條的下邊向上方連續對折2 次,壓出摺痕後展開,此時有三條摺痕,從上到下依次是下摺痕、下摺痕和上摺痕。思路:摺痕將字條分成兩部分,下次對折時,摺痕的上部會出現乙個下摺痕,下部會出現乙個上摺痕。
public static void main(string args)
public static void method(int num, boolean down)
method(num - 1, true);
system.out.println(down ? "down" : "up");
method(num - 1, false);
}
down
down
up down
down
up up
7、給你乙個棧,請你逆序這個棧,不能申請額外的資料結構,只能使用遞迴函式。如何實現?思路:要逆序,就是每次都取出當前棧的最底部的數,遞迴返回時將其壓入棧中。
//每次都取出當前棧的最底部的數,遞迴返回時將其壓入棧中。
public static void method(stackstack)
int num = getandremovelastnumber(stack);
method(stack);
stack.push(num);
}//要取出最底部的數也是通過遞迴實現。
public static int getandremovelastnumber(stackstack)
int num = stack.pop();
last = getandremovelastnumber(stack);
stack.push(num);
return last;
}
Idea 02 暴力遞迴與動態規劃(1)
1.1 暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個子問題的解 1.2 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來,避免重複計算 3,把暴力遞迴的過程,抽...
動態規劃與遞迴
這裡借用leetcode的一道例題,來說一下動態規劃和遞迴的區別 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 1 的兩個結點。例如,給定三角形 2 3,4 6,5,7 4,1,8,3...
js動態規劃與遞迴
動態規劃 從底部開始解決問題,將所有 小問題解決掉,然後合併成乙個整體解決方案,從而解決掉整個大問題 遞迴 從頂部開始將問題分解,通過解決掉所有分解的小問題來解決整個問題 計算斐波那契數列 function recurfib n else 遞迴 很多函式執行了多次 動態規劃使用乙個陣列儲存部分函式計...