// 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);
}
}
}
数组、回溯-[1995]统计特殊四元组
最新推荐文章于 2022-01-01 23:56:19 发布
本文解析了一种统计特殊四元组的算法,通过Solution类中的countQuadruplets方法,利用回溯法遍历整数数组,寻找满足特定条件的四元组。重点介绍了backtrace辅助函数的调用策略和条件判断。
摘要由CSDN通过智能技术生成