[Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
生活随笔
收集整理的這篇文章主要介紹了
[Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
【解答思路】
1. 回溯搜索算法 + 剪枝 ,直接來到葉子結點
時間復雜度:O(N^2) 空間復雜度:O(N)
2. 有序數組(鏈表)模擬
時間復雜度:O(N2) 空間復雜度:O(N)
import java.util.LinkedList; import java.util.List;public class Solution {public String getPermutation(int n, int k) {// 注意:相當于在 n 個數字的全排列中找到下標為 k - 1 的那個數,因此 k 先減 1k --;int[] factorial = new int[n];factorial[0] = 1;// 先算出所有的階乘值for (int i = 1; i < n; i++) {factorial[i] = factorial[i - 1] * i;}// 這里使用數組或者鏈表都行List<Integer> nums = new LinkedList<>();for (int i = 1; i <= n; i++) {nums.add(i);}StringBuilder stringBuilder = new StringBuilder();// i 表示剩余的數字個數,初始化為 n - 1for (int i = n - 1; i >= 0; i--) {int index = k / factorial[i] ;stringBuilder.append(nums.remove(index));k -= index * factorial[i];}return stringBuilder.toString();} }作者:liweiwei1419 鏈接:https://leetcode-cn.com/problems/permutation-sequence/solution/hui-su-jian-zhi-python-dai-ma-java-dai-ma-by-liwei/【總結】
1. 剪枝大法好 充分利用條件邊界 減少回溯
2.回溯思想
【數據結構與算法】【算法思想】回溯算法
3.常規思路超時 全排列 dfs傳遞的是深度 不是具體某一個值
相關題目
[Leedcode][JAVA][第46題][全排列][回溯算法]
轉載鏈接:https://leetcode-cn.com/problems/permutation-sequence/solution/hui-su-jian-zhi-python-dai-ma-java-dai-ma-by-liwei/
總結
以上是生活随笔為你收集整理的[Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 keeplive+lvs
- 下一篇: 生成随机长度字符串,比如密码等