leetcode——回溯法

22. 括號生成

題目:數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。

示例

輸入:n = 3
輸出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

--------------------------------------------------------------------------------------------------

思路:定義一個記錄當前左括號數量leftCnt和當前右括號數量rightCnt。想象成一個二叉樹,向左嘗試即爲加上'('的字符串,右向右嘗試即爲加上')'的字符串。不斷向左和向右試探,如果右括號數量大於左括號數量 或者 左右括號數量有一個超過n值,則返回。

   public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        dfs(res, "", 0, 0, n);
        return res;
    }

    void dfs(List<String> res, String path, int leftCnt, int rightCnt, int n) {
      if(leftCnt == rightCnt && leftCnt == n) {
        res.add(path);
        return;
      }
      if(leftCnt < n)
        dfs(res, path + '(', leftCnt + 1, rightCnt, n);
      if(rightCnt < leftCnt)
      dfs(res, path + ')', leftCnt, rightCnt + 1, n);
    }

 


46. 全排列

題目:給定一個 沒有重複 數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

--------------------------------------------------------------------------------------------------

思路:對於數1,它有2,3兩個數字可選:對於(12)則只有選擇3;對於(13)則只有選擇2。其他兩個數也是類似的道理。

   List<List<Integer>> res = new LinkedList<>();

    public List<List<Integer>> permute(int[] nums) {
      createTree(nums, new LinkedList<Integer>());
      return res;
    }

    void createTree(int[] nums, LinkedList<Integer> path) {
      if(path.size() == nums.length) {
        res.add(new LinkedList(path));
        return;
      }
      for(int i = 0; i < nums.length; i++) {
        if(path.contains(nums[i]) != true) {
          path.add(nums[i]);
          createTree(nums, path);
          path.removeLast();
        }
      }
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章