每日三题-组合总和、全排列、括号生成

简介: 每日三题组合总和全排列括号生成

组合总和


2c71e419f1644d85b0f4a4a8d452bbce.png

解法一

递归+回溯

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        dfs(candidates,target,res,list,0);
        return res;
    }
    public void dfs(int [] candidates,int target,List<List<Integer>> res,List<Integer> list,int idx){
        if(target < 0 || idx >= candidates.length) return;
        if(target == 0){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i = idx;i < candidates.length;i++){
            list.add(candidates[i]);
            dfs(candidates,target-candidates[i],res,list,i);
            list.remove(list.size()-1);
        }
    }
}


全排列


2d7b508c28ee4f498ef8443c40270407.png

解法一

递归+回溯

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        int visited[] = new int[nums.length];
        dfs(res,nums,list,visited);
        return res;
    }
    public void dfs(List<List<Integer>> res,int [] nums,List<Integer> list,int [] visited){
        if(list.size() == nums.length){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i = 0;i < nums.length;i++){
            if(visited[i] == 0){
                visited[i] = 1;
                list.add(nums[i]);
                dfs(res,nums,list,visited);
                list.remove(list.size()-1);
                visited[i] = 0;
            }
        }
    }
}


括号生成


18c9723cd30a42619dd2274422d4add1.png

解法一

递归+回溯

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        dfs(res,sb,n,0,0);
        return res;
    }
    public void dfs(List<String> res,StringBuilder sb,int n,int open,int close){
        if(sb.length() == n * 2){
            res.add(sb.toString());
            return;
        }
        if(open < n){
            sb.append('(');
            dfs(res,sb,n,open+1,close);
            sb.deleteCharAt(sb.length()-1);
        }
        if(close < open){
            sb.append(')');
            dfs(res,sb,n,open,close+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}
相关文章
|
3天前
|
机器学习/深度学习 算法 测试技术
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
|
7月前
|
算法
代码随想录Day21 回溯 LeetCodeT216 组合总和III LeetCode T17电话号码的字母总和
代码随想录Day21 回溯 LeetCodeT216 组合总和III LeetCode T17电话号码的字母总和
32 0
|
3天前
|
算法
贪心算法:排列算式
贪心算法:排列算式
7 0
|
3天前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
32 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
3天前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
38 0
|
5月前
|
存储 算法
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转
|
5月前
|
算法 测试技术 C#
C++二分查找算法:最大为 N 的数字组合
C++二分查找算法:最大为 N 的数字组合
|
7月前
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
代码随想录Day22 LeetCode T39 组合总和 T40 组合总和II T131 分割回文串
20 0
|
11月前
|
算法 Java 网络架构
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录训练营day27| 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录刷题|Leetcode 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录刷题|Leetcode 39. 组合总和 40.组合总和II 131.分割回文串
代码随想录刷题|Leetcode 39. 组合总和 40.组合总和II 131.分割回文串