46.全排列,47*全排列II(数组中含有重复元素),332重新安排行程,51N皇后
    46.全排列

    1. private List<List<Integer>>res=new ArrayList<>();
    2. private List<Integer>singleRes=new LinkedList<>();
    3. private boolean[]used;
    4. public List<List<Integer>> permute(int[] nums) {
    5. used=new boolean[nums.length];
    6. backTrack(0,nums);
    7. return res;
    8. }
    9. private void backTrack(int index,int[]nums){
    10. if(singleRes.size()==nums.length){
    11. res.add(new ArrayList<>(singleRes));
    12. return;
    13. }
    14. for(int i=index;i<nums.length;i++){
    15. if(used[i]){
    16. continue;
    17. }
    18. singleRes.add(nums[i]);
    19. used[i]=true;
    20. backTrack(index,nums);
    21. singleRes.remove(singleRes.size()-1);
    22. used[i]=false;
    23. }
    24. }
    1. 47.全排列2
    1. private List<List<Integer>>res=new ArrayList<>();
    2. private List<Integer>singleRes=new LinkedList<>();
    3. private boolean[]used;
    4. public List<List<Integer>> permuteUnique(int[] nums) {
    5. used=new boolean[nums.length];
    6. Arrays.sort(nums);
    7. backTrack(0,nums);
    8. return res;
    9. }
    10. private void backTrack(int index,int[]nums){
    11. if(singleRes.size()==nums.length){
    12. res.add(new ArrayList<>(singleRes));
    13. return;
    14. }
    15. for(int i=index;i<nums.length;i++){
    16. if(i>index&&nums[i]==nums[i-1]&&used[i-1]==false){
    17. continue;
    18. }
    19. if(used[i]==false){
    20. singleRes.add(nums[i]);
    21. used[i]=true;
    22. backTrack(index,nums);
    23. singleRes.remove(singleRes.size()-1);
    24. used[i]=false;
    25. }
    26. }
    27. }

    332.重新安排行程

    1. private List<String>res=new ArrayList<>();
    2. private Map<String, PriorityQueue<String>> map=new HashMap<>();
    3. public List<String> findItinerary(List<List<String>> tickets) {
    4. for (List<String> ticket : tickets) {
    5. String start=ticket.get(0);
    6. String end=ticket.get(1);
    7. if(!map.containsKey(start)){
    8. map.put(start,new PriorityQueue<>());
    9. }
    10. map.get(start).add(end);
    11. }
    12. backTrack("JFK",map);
    13. Collections.reverse(res);
    14. return res;
    15. }
    16. private void backTrack(String depart,Map<String,PriorityQueue<String>>map){
    17. while (map.containsKey(depart)&&map.get(depart).size()>=1) {
    18. String poll = map.get(depart).poll();
    19. backTrack(poll, map);
    20. }
    21. res.add(depart);
    22. }
    1. 51.N皇后
    1. private List<List<String>>res=new ArrayList<>();
    2. public List<List<String>> solveNQueens(int n) {
    3. char[][]chars=new char[n][n];
    4. for(int i=0;i<chars.length;i++){
    5. for(int j=0;j<chars[0].length;j++){
    6. chars[i][j]='.';
    7. }
    8. }
    9. backTrack(0,n,chars);
    10. return res;
    11. }
    12. private void backTrack(int row,int n,char[][]chars){
    13. if(row==n){
    14. res.add(charArrayToList(chars));
    15. return;
    16. }
    17. for(int col=0;col<n;col++){
    18. if(check(row,col,chars)){
    19. chars[row][col]='Q';
    20. backTrack(row+1,n,chars);
    21. chars[row][col]='.';
    22. }
    23. }
    24. }
    25. private boolean check(int row,int col,char[][]chars){
    26. //检查同一列
    27. for(int i=row;i>=0;i--){
    28. if(chars[i][col]=='Q'){
    29. return false;
    30. }
    31. }
    32. //检查45度角
    33. for(int i=row,j=col;i>=0&&j>=0;i--,j--){
    34. if(chars[i][j]=='Q'){
    35. return false;
    36. }
    37. }
    38. //检查135°角
    39. for(int i=row,j=col;i>=0&&j<chars[0].length;i--,j++){
    40. if(chars[i][j]=='Q'){
    41. return false;
    42. }
    43. }
    44. return true;
    45. }
    46. private List<String> charArrayToList(char[][]chars){
    47. List<String>list=new ArrayList<String>();
    48. for (char[] aChar : chars) {
    49. list.add(String.copyValueOf(aChar));
    50. }
    51. return list;
    52. }