Leetcode刷題之路(41-50)

46.全排列

全排列題目鏈接

  • 典型的dfs模板題
List<List<Integer>> results;
    boolean [] flags ;
    public List<List<Integer>> permute(int[] nums) {
        results = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        if(nums==null||nums.length==0){
            results.add(list);
            return results;
        }
        list.add(0);
        flags = new boolean[nums.length];
        dfs(list,nums,0);
        return results;
    }

    public void dfs(List<Integer> list,int [] nums,int cur){
        if(cur>nums.length){
            return;
        }
        if(cur==nums.length){
           //注意這裏不能直接添加list,List是引用傳遞,這裏的list是方法外中的list的副本,這裏添加list是直接添加了方法外的list對象,而方法外的list爲空...
            results.add(new ArrayList<>(list));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(!flags[i]){
                flags[i]=true;
                list.add(nums[i]);
                dfs(list,nums,cur+1);
                flags[i]=false;
                list.remove(list.size()-1);
            }
        }
    }

47.全排列 II

全排列題目鏈接

  • 和上一道幾乎一樣的思路,dfs模板,就加個條件,可以用一個map來存儲順序
	List<List<Integer>> results = new ArrayList<>();
    boolean [] flags;
    Map<String,Boolean> map; 
    public List<List<Integer>> permuteUnique(int[] nums) {
             List<Integer> list = new ArrayList<>();
             if(nums==null||nums.length==0){
                 results.add(list);
                 return results;
             }
             flags=new boolean[nums.length];
             map = new HashMap<>();
             dfs(nums,list,0);
             return results;
    }
    
    public void dfs(int [] nums,List<Integer> list,int cur){
         if(cur>nums.length){
             return;
         }
         if(cur==nums.length){
             StringBuilder stringBuilder = new StringBuilder();
             list.forEach(li->{
                 stringBuilder.append(li);
             });
             if(map.containsKey(stringBuilder.toString())){
                 return;
             }
             map.put(stringBuilder.toString(),true);
             results.add(new ArrayList<>(list));
             return;
         }
         for(int i=0;i<nums.length;i++){
             if(!flags[i]){
                 flags[i]=true;
                 list.add(nums[i]);
                 dfs(nums,list,cur+1);
                 list.remove(list.size()-1);
                 flags[i]=false;
             }
         }
    }

49.字母異位詞分組

字母異位詞分組題目鏈接

  • 循環每個字符串,用字符串拼接a-z出現的次數,而這個字符串映射一個下標,思路很清晰就可以解決了!
List<List<String>> results;
    Map<String,Integer> map;
    public List<List<String>> groupAnagrams(String[] strs) {
        results = new ArrayList<>();
        map = new HashMap<>();
        if(strs==null||strs.length==0){
            return results;
        }
        int count = 0;
        for(int i=0;i<strs.length;i++){
            String str = strs[i];
            int num = 0;
            int [] zimu = new int[26];
            for(int j=0;j<str.length();j++){
                char s = str.charAt(j);
                zimu[s-97]++;
            }
            StringBuilder stringBuilder = new StringBuilder();
            for(int j=0;j<26;j++){
                stringBuilder.append(zimu[j]);
            }
            if(map.containsKey(stringBuilder.toString())){
                int index=map.get(stringBuilder.toString());
                results.get(index).add(strs[i]);
            }
            else{
                map.put(stringBuilder.toString(),count++);
                List<String> list = new ArrayList<>();
                list.add(strs[i]);
                results.add(list);
            }

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