四数问题下逻辑运算符的注意事项

本文深入探讨了四数之和问题的解决方案,通过将问题转换为外层循环加一个三数之和的方式,详细解释了如何避免重复的三元组,并强调了逻辑判断顺序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

public static List<List<Integer>> fourSum(int[] nums, int target) {
       int firs;
        int seco;
        int thir;
        int four;
        int temp;
        List<List<Integer>> res = new LinkedList<>();
        Arrays.sort(nums);
        for (firs = 0; firs < nums.length; firs++) {
            if (firs > 0 && nums[firs] == nums[firs - 1])   continue;
            for (seco = firs + 1; seco < nums.length; seco++) {
                if (seco > firs + 1 && nums[seco] == nums[seco - 1]) continue;
                thir = seco + 1;
                four = nums.length - 1;
                while (thir < four) {
                    temp = nums[firs] + nums[seco] + nums[thir] + nums[four];
                    if (temp == target) {
                        res.add(Arrays.asList(nums[firs], nums[seco], nums[thir], nums[four]));
                        while (thir < four && nums[thir] == nums[thir + 1]) thir++;
                        while (thir < four && nums[four] == nums[four - 1]) four--;
                        thir++;
                        four--;
                    } else if (temp > target) {
                        while (four > thir && nums[four] == nums[four - 1]) four--;
                        four--;

                    } else {
                        while (thir < four && nums[thir] == nums[thir + 1] ) thir++;
                        thir++;
                    }
                }
            }
        }
        return res;
    }

以上为第一次写出的解决方法,具体做法是将四数之和转换为外层循环加一个三数之和(而三数之和可以转换为外层循环加双指针问题)。

但是测试时,输入数组{0,0,0,0}与target=0,会在

while (nums[thir] == nums[thir + 1] && thir < four) thir++;

这一语句处报ArrayIndexOutOfBoundsException异常,经过debug后发现,逻辑运算符&&的左右判断语句的顺序影响了程序的正确性。

此时,thir = 3, 先进行判断nums[thir] == nums[thir + 1],然后判断thir < four都满足于是 thir++,此时thir = 4,然后再次进行判断nums[thir] == nums[thir + 1] ,此时thir + 1 = 4,于是就发生数组下标越界的异常。

根据逻辑,每次进行比较前应先判断是否第三个数小于第四个,所以应该将

while (nums[thir] == nums[thir + 1] && thir < four) thir++;
while (nums[four] == nums[four - 1] && thir < four) four--;

中的两个while循环中的逻辑判断顺序调换一下:

while (thir < four && nums[thir] == nums[thir + 1]) thir++;
while (thir < four && nums[four] == nums[four - 1]) four--;

果然调换了一下顺序之后就对了,在进行数组判断之前,会先判断thir < four,若thir = 4,则这时已经不满足了,就不会进行后面的判断。 


其实程序是次要的,主要是在进行逻辑判断的时候,一定要注意先后顺序(吃了好几次这样的亏,特此记录一下)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值