回溯法解决括号生成问题的一个小细节——自增自减和变量-1、+1的区别

class Solution {
    public List<String> resList = new ArrayList<>();
    public List<String> generateParenthesis(int n) {
        int left = n, right = n;
        StringBuilder sb = new StringBuilder();
        backTrace(left, right, sb);
        return resList;
    }
    public void backTrace(int left, int right,StringBuilder sb){
        //base
        if(left>right){
            return;
        }
        if(right==0 && left==0){
            System.out.print("[left:"+left+",right:"+right+"]");
            resList.add(sb.toString());
            return;
        }

        if(left>0){
            sb.append("(");
            backTrace(--left,right,sb);
            sb.deleteCharAt(sb.lastIndexOf("("));
            left++;
        }
        if(right>0){
            sb.append(")");
            backTrace(left, --right, sb);
            sb.deleteCharAt(sb.lastIndexOf(")"));
            right++;
        }

    }
}

注意:如果通过回溯,希望某个传入的参数实现每次迭代都-1/+1时,如果使用:
(1)自增/自减方式:
那么请 将+/-号放在变量名前面:--left/++left,这样才能有效增加,left++等均无效
即:加完/减完再进入这个函数。
(2)直接-1/+1方式:
这里有个需要注意的方式,如果是递归类型,则需要考虑
backTrace(left-1) 仅在进入到下一个递归中时left的值为+1后的值,而递归结束回到当前递归时,left的值恢复到+1之前的left值。
总结:所以本题需要注意,如果采用的是left-1,则不需要在撤销选择的时候left+1,而如果使用的是--left,则需要在撤销选择的时候++left
对于自增变量传入函数的理解:
如果left--传入backTrace的第二个递归,

public void backTrace(left--){
		方法体(left);
}

可以看作:

public void backTrace(left){
		方法体(left);
		left-1;
}

并且回到上一递归时,left的值依然是–之前的值,所以这样很可能出现StackOverFlow的异常。

开心,这个细节最近都有草蛇灰线,今天终于搞清楚了一点点,有理解不对的地方请指出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值