数组、回溯-[1995]统计特殊四元组

// 1995. 统计特殊四元组
class Solution {
    public int countQuadruplets(int[] nums) {
        // 存放结果
        int[] ans = new int[]{0};

        // 由题意 四元组 (a, b, c, d)
        // 1.首先选择出d对应的元素
        //      a.由于需要满足 a < b < c < d 所以我们这里从后往前遍历
        //      b.由于需要找到4个元素,且满足下标递增的条件,所以我们这里可以遍历到第四个元素(从左往右数) 即可结束
        // 2.这里调用backtrace()的一些参数给个说明,注意与下面的对比
        //      a.第二个参数 : 当前遍历元素的下标
        //      b.  三      : 在这个函数里代表四元组中d位置对应的元素在nums中的值,在 backtrace()的后续调用中,表示减去nums[i]后剩余的值
        //      c.  四      : 这里表示需要后续需要执行的次数,即在这里选择完d的下标后,需要后续选择出 c、b、a的下标(所以在这里直接传递3进去),每选择一次times减一
        for(int i = nums.length - 1; i >= 3; i-- ){
            backtrace(nums, i, nums[i], 3, ans);
        }

        return ans[0];
    }

    /***
     *
     * @param nums :
     * @param ind : 需要遍历元素的前一个下标
     * @param remainVal : 剩余的值(remain value)
     * @param times : 剩余可执行的次数
     * @param ans : 最后的结果
     */
    private void backtrace(int[] nums, int ind, int remainVal, int times, int[] ans){
        if(times == 0){
            // 已经找到4个下标
            if(remainVal == 0){
                // 如果符合nums[a] + nums[b] + nums[c] == nums[d]
                ans[0]++;
            }
            
            // 直接返回,因为已经记录四个下标
            return;
        }if(remainVal < 0){
            // 如果没有找到四个下标,但是较小下标对应的值的和,已经大于在countQuadruplets()的for循环中选择的最大坐标对应的值,则直接返回
            return;
        }

        // 遍历 ind 之后的元素
        // 这里主要是拿着remainVal的值与ind之后的元素进行相减,生成下一次的处理,同时处理次数减一
        for(int i = ind - 1; i >= 0; i--){
            backtrace(nums, i, remainVal - nums[i], times - 1, ans);
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值