力扣之旅第17天(第18题:四数之和)

(一、排序+双指针)

这道题跟之前第15题有点类似,还是可以使用排序加双指针来做的。我们先将数组进行排序,然后定义两个for循环,第一层for循环控制第一个数,第二个for循环控制第二个数;然后定义双指针,左指针控制第三个数,右指针控制第四个数,分情况控制其四个数的取值范围,定义List集合,将所有的情况添加至list集合中。

代码:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list=new ArrayList<List<Integer>>();//定义List集合来储存答案
        Arrays.sort(nums);//将数组进行排序
        int n=nums.length;//定义n为数组长度
        for(int a=0;a<n-3;a++){//第一重for循环,a代表第一个数,其取值为[0,n-4]
            if(a>0 && nums[a]==nums[a-1]){//保证第一个数在下一次判断时不被重复
                continue;
            }
            for(int b=a+1;b<n-2;b++){//第二重for循环,b代表第二个数,其取值为[a+1,n-3]
                if (b>a+1 && nums[b]==nums[b-1]){//保证第二个数在下一次判断时不被重复
                    continue;
                }
                int c=b+1;//定义左指针,代表第三个数
                int d=n-1;//定义右指针,代表第四个数
                while(c<d){//保证两指针不相遇
                    int num=nums[a]+nums[b]+nums[c]+nums[d];//定义num为四数之和
                    if(num>target){//当num大于目标值时
                        d--;//将右指针向左移
                        while(c<d && nums[d]==nums[d+1]){//保证第三个数在下一次判断时不被重复
                            d--;//如果重复且两指针还没相遇时将右指针向左移
                        }
                    }
                    if (num<target){//当num小于目标值时
                        c++;//将左指针向右移
                        while(c<d && nums[c]==nums[c-1]){//保证第四个数在下一次判断时不被重复
                            c++;//如果重复且两指针还没相遇时将左指针向右移
                        }
                    }
                    if (c==d){//当两指针相遇时,结束while循环
                        break;
                    }
                    if(num==target)//当num值与目标值target相等时
                    {
                        List l=new ArrayList();//定义l集合用来储存四个数
                        l.add(nums[a]);
                        l.add(nums[b]);
                        l.add(nums[c]);
                        l.add(nums[d]);
                        if(!list.contains(l)){//判断list集合中是否含有重复的l元素(这时l为list中的元素)
                        list.add(l);//如果没有将l添加进list集合中
                        }
                        c++;//将左指针向右移
                        continue;
                    }
                }
            }
        }
        return list;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是力扣LeetCode)上的经典问:两数之和(Two Sum)的 C 语言解法。 ```c #include <stdio.h> #include <stdlib.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int i, j; int* result = (int*)malloc(sizeof(int) * 2); *returnSize = 2; for (i = 0; i < numsSize - 1; i++) { for (j = i + 1; j < numsSize; j++) { if (nums[i] + nums[j] == target) { result[0] = i; result[1] = j; return result; } } } return NULL; } int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int returnSize; int* result = twoSum(nums, sizeof(nums) / sizeof(nums[0]), target, &returnSize); if (result != NULL) { printf("[%d, %d]\n", result[0], result[1]); free(result); } return 0; } ``` 这个程序首先定义了一个函数 `twoSum()`,它接受一个整数数组 `nums`,数组的长度 `numsSize`,目标值 `target` 和一个指向整数变量的指针 `returnSize`。这个函数的目的是在给定数组中找到两个数,它们的和等于目标值,并返回这两个数的下标。 函数内部使用了两个嵌套的循环来枚举数组中的所有可能的组合,并检查它们的和是否等于目标值。如果找到了符合条件的组合,就把它们的下标存储在一个动态分配的整数数组中,并返回这个数组的指针。如果没有找到符合条件的组合,就返回空指针。 在 `main()` 函数中,我们定义了一个测试用例,即整数数组 `{2, 7, 11, 15}` 和目标值 `9`。然后我们调用 `twoSum()` 函数,传入这个测试用例,并打印出返回的结果。 值得注意的是,我们在 `twoSum()` 函数内部动态分配了一个整数数组 `result`,然后在 `main()` 函数中使用 `free()` 函数释放了它的内存,以避免内存泄漏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值