力扣22. 括号生成(java 回溯法)

Problem: 22. 括号生成

题目描述

在这里插入图片描述

思路

我们首先要知道,若想生成正确的括号我们需要让右括号去适配左括号,在此基础上我们利用回溯去解决此题目

1.题目给定n个括号,即当回溯决策路径长度等于 2 n 2n 2n时,我们结束回溯;
2.若想选择出正确的括号,我们先要确定
左括号*,即要求左括号小于给定的数量n,同时已经使用的右括号要小于已经使用的左括号,所以我们可以定义已使用的左括号数量lestUsed已经使用的右括号数量rightUsed,在这两种情况下展开回溯;

解题方法

1.定义结果集合result,决策路劲path(char类型数组,初始化长度为 2 n 2n 2n);
2.编写并调用回溯函数,初始化决策阶段为0;

2.1当决策路径长度等于 2 n 2n 2n时,将当前的决策路径添加到结果集合中,并返回;
2.2当leftUsed小于n时我们将当前决策路径位置上添上**(,并递归下一阶段(leftUsed 要加一,决策阶段加一)
2.3当
rightUsed小于leftUsed时我们将当前决策路径位置上添上,并递归下一阶段(rightUsed 要加一,决策阶段加一)
2.4由于定义的决策路径为一个char类型的数组,所以我们不用显示的
恢复当前的决策路径状态**,数组在递归调用中会覆盖上一个

复杂度

时间复杂度:

O ( 1 n + 1 ( 2 n n ) ) O(\frac{1}{n+1}\binom{2n}{n}) O(n+11(n2n))

空间复杂度:

O ( 4 n n ) O\left(\frac{4^n}{\sqrt{n}}\right) O(n 4n)

Code

class Solution {
    //Result list
    private List<String> result = new ArrayList<>();

    /**
     * Get all parentheses generated
     *
     * @param n The num of parenthesis
     * @return List<String>
     */
    public List<String> generateParenthesis(int n) {
        //Decision Path
        char[] path = new char[2 * n];
        backtrack(n, 0, 0, 0, path);
        return result;
    }

    /**
     * Use backtracking to get all parentheses generated
     *
     * @param n         The num of parenthesis
     * @param leftUsed  The number of left parentheses used
     * @param rightUsed The number of right parentheses used
     * @param k         Decision stage
     * @param path      Decision path
     */
    private void backtrack(int n, int leftUsed, int rightUsed, int k, char[] path) {
        //End condition
        if (k == 2 * n) {
            result.add(String.valueOf(path));
            return;
        }
        //The leftUsed less than n
        if (leftUsed < n) {
            path[k] = '(';
            backtrack(n, leftUsed + 1, rightUsed, k + 1, path);
        }
        //The rightUsed less than leftUsed
        if (rightUsed < leftUsed) {
            path[k] = ')';
            backtrack(n, leftUsed, rightUsed + 1, k + 1, path);
        }
    }
}
  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值