leetcode77 组合
- class Solution {
-     public List<List<Integer>> combine(int n, int k) {
-         List<List<Integer>> res = new ArrayList<>();
-         if(n<k||k<=0) return res;
-         Deque<Integer> path = new LinkedList<Integer>();
-         dfs(res,path,1,n,k);
-         return res;
-     }
-     private void dfs(List<List<Integer>> list, Deque<Integer> path, int i,int n, int k){
-         if(path.size()==k){
-             list.add(new ArrayList<Integer>(path));
-             return;
-         }
-         //利用剪枝的思想
-         for(int j=i;j<=n+1-(k-path.size());j++){
-             path.addLast(j);
-             dfs(list,path,j+1,n,k);
-             path.removeLast();//回溯
-         }
-     }
- }
leetcode39 组合总和
- //回溯+剪枝优化
- class Solution {
-     public List<List<Integer>> combinationSum(int[] candidates, int target) {
-         List<List<Integer>> res = new ArrayList<>();
-         Arrays.sort(candidates);
-         if(candidates[0]>target) return res;
-         Deque<Integer> path = new LinkedList<>();
-         int index = 0;
-         dfs(res, path, candidates, index, target);
-         return res;
-     }
-     private void dfs(List<List<Integer>> res, Deque<Integer> path, int[] candidates, int index, int target){
-         if(target==0){
-             res.add(new ArrayList<Integer>(path));
-             return;
-         }
-         for(int i=index;i<candidates.length;i++){
-             if(target-candidates[i]<0) break;
-             path.addLast(candidates[i]);
-             dfs(res,path,candidates,i,target-candidates[i]);
-             path.removeLast();
-         }        
-     }
- }
leetcode40 组合总和II
- class Solution {
-     public List<List<Integer>> combinationSum2(int[] candidates, int target) {
-         List<List<Integer>> res = new ArrayList<>();
-         Deque<Integer> path = new LinkedList<>();        
-         Arrays.sort(candidates);
-         dfs(candidates,res,path,0,target);
-         return res;
-     }
-     private void dfs(int[] candidates,List<List<Integer>> res,Deque<Integer> path, int begin, int target){
-         if(target==0){
-             List<Integer> list = new ArrayList<>(path);
-             res.add(list);  
-             return;
-         }
-         for(int i=begin;i<candidates.length;i++){
-             if(target-candidates[i]<0) break;
-             //保证在本层不重复,在不同层可重复
-             if(i>begin&&candidates[i]==candidates[i-1]){
-                 continue;
-             }
-             path.addLast(candidates[i]);
-             dfs(candidates,res,path,i+1,target-candidates[i]);
-             path.removeLast();
-         }
-     }
- }
leetcode46 全排列
- class Solution {
-     public List<List<Integer>> permute(int[] nums) {
-         int len = nums.length;
-         boolean[] flag = new boolean[len];
-         List<List<Integer>> res = new ArrayList<>();
-         LinkedList<Integer> path = new LinkedList<>();
-         backtrack(res, path, flag, nums);
-         return res;
-     }
-     public void backtrack(List<List<Integer>> res, LinkedList<Integer> path, boolean[] flag, int[] nums){
-         int len = nums.length;
-         if(path.size()==len){
-             res.add(new ArrayList<>(path));
-             return; //剪枝
-         }
-         for(int i=0;i<len;i++){
-             if(!flag[i]){
-                 path.add(nums[i]);
-                 flag[i] = true;
-                 backtrack(res, path, flag, nums);
-                 path.removeLast();
-                 flag[i] = false;
-             }
-         }
-     }
- }
leetcode47 全排列 II
- class Solution {
-     public List<List<Integer>> permuteUnique(int[] nums) {
-         int len = nums.length;
-         boolean[] used = new boolean[len];
-         List<List<Integer>> res = new ArrayList<>();
-         Deque<Integer> path = new LinkedList<>();
-         Arrays.sort(nums);
-         dfs(nums,res,path,used);
-         return res;
-     }
-         private void dfs(int[] nums, List<List<Integer>> res, Deque<Integer> path,boolean[] used){
-         if(path.size()==nums.length) {
-             res.add(new ArrayList<Integer>(path));
-             return;
-             }
-         for(int i=0;i<nums.length;i++){
-             if(i>0&&nums[i]==nums[i-1]&&!used[i-1]) continue;//去重
-             if(used[i]==false){
-                 used[i] = true;
-                 path.addLast(nums[i]);
-                 dfs(nums,res,path,used);
-                 used[i] =false;//关键
-                 path.removeLast();
-             }
-         }
-     }
- }
leetcode 22 括号生成
- class Solution {
-     public List<String> generateParenthesis(int n) {
-         List<String> res = new ArrayList<>();
-         if(n==0) return res;
-         dfs("",0,0,n,res);
-         return res;
-     }
-     public void dfs(String path,int left,int right,int n,List<String> res){
-         if(left==n&&right==n){
-             res.add(path);
-             return;
-         }
-         //如果左括号用的比右括号少,则返回
-         if(left<right){
-             return;
-         }
-         if(left<n){
-             dfs(path+"(",left+1,right,n,res);
-         }
-         if(right<n){
-             dfs(path+")",left,right+1,n,res);
-         }
-     }
- }
leetcode79 单词搜索
- class Solution {
-     public boolean exist(char[][] board, String word) {
-         for(int i=0;i<board.length;i++){
-             for(int j=0;j<board[0].length;j++){
-                 if(search(board, word, i, j, 0)){
-                     return true;
-                 }
-             }
-         }
-         return false;
-     }
-     public boolean search(char[][] board, String word, int i, int j, int k){
-         if(k>=word.length()){
-             return true;
-         }
-         if(i>=board.length||i<0||j<0||j>=board[0].length||board[i][j]!=word.charAt(k)){
-             return false;
-         }
-         board[i][j]+=100;
-         boolean res = search(board, word, i+1, j, k+1)||search(board, word, i-1, j, k+1)||search(board, word, i, j+1, k+1)||search(board, word, i, j-1, k+1);
-         board[i][j]-=100;
-         return res;
-     }
- }
leetcode 17 电话号码的字母组合
- class Solution {
-     // 存放电话按键对应的字母
-     String[] map = {"abc", "def", "ghi", "jkl", "mno", "qprs", "tuv", "wxyz"};
-     public List<String> res = new ArrayList<>();
-     public List<String> letterCombinations(String digits) {
-         // 判断是否为空
-         if(digits.isEmpty()){
-             return res;
-         }
-         StringBuilder path = new StringBuilder();
-         backtrack(0,digits,path);
-         return res;
-     }
-     public void backtrack(int i, String digits, StringBuilder path){
-         if(path.length()==digits.length()){
-             res.add(path.toString());
-             return;
-         }
-         String str = map[digits.charAt(i)-'2'];
-         for(int m=0;m<str.length();m++){
-             path.append(str.charAt(m));
-             backtrack(i+1,digits,path);
-             path.deleteCharAt(path.length()-1);
-         }
-     }
- }
leetcode 24 括号生成
- class Solution {
-     public List<String> res;
-     public List<String> generateParenthesis(int n) {
-         res = new ArrayList<>();
-         generate("", 0,0,n);
-         return res;
-     }
-     public void generate(String str, int leftCount, int rightCount, int n){
-         if(leftCount>n||rightCount>n){
-             return;
-         }
-         if(leftCount==n&&rightCount==n){
-             res.add(str);
-         }
-         if(leftCount>=rightCount){
-             String newStr = new String(str);
-             generate(newStr+"(",leftCount+1,rightCount,n);
-             generate(newStr+")",leftCount,rightCount+1,n);
-         }
-     }
- }