6-图文打造LeeCode算法宝典-数组与排序算法题解

本文探讨了数组中的三数之和问题,通过双指针法找出满足a+b+c=0的不重复三元组。同时介绍了如何计算二维数组中岛屿的最大面积,以及在旋转排序数组中进行高效搜索的两种解法。最后讨论了朋友圈的识别与接雨水问题的算法优化。

摘要生成于 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]
]
思路

双指针法

首先对数组进行排序,排序后固定一个数nums[i]nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为nums[L]nums[L]和nums[R],计算三个数的和sum判断是否满足为 0,满足则添加进结果集

如果nums[i]大于 0,则三数之和必然无法等于 0,结束循环

如果nums[i] = nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过

当sum = 0时,nums[L] = nums[L+1]则会导致结果重复,应该跳过,L++

当sum =0 时,nums[R]= nums[R-1]则会导致结果重复,应该跳过,R–

时间复杂度:O(n^2),n为数组长度

代码实现
public static List<List<Integer>> threeSum(int[] nums) {
   
   
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        //数组大小小于3
        if (nums == null || nums.length < 3){
   
   
            return res;
        }
        //排序
        Arrays.sort(nums);

        int len = nums.length;

        for (int i = 0 ; i < len; i++){
   
   
            if (nums[i] > 0)
                break;

            //去重
            if (i > 0 && nums[i] == nums[i-1]){
   
   
                continue;
            }

            int l = i + 1;
            int r = len - 1;
            while (l < r && r > 0){
   
   
                int sum = nums[i] + nums[l] + nums[r];

                if(sum == 0){
   
   
                    List<Integer> temp = new ArrayList<Integer>();
                    temp.add(nums[i]);
                    temp.add(nums[l]);
                    temp.add(nums[r]);
                    res.add(temp);

                    //去重
                    while (l < len-1 && nums[l] == nums[l+1]) l++;
                    while (r > 0 &&a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xianghan收藏册

极简精品作,一分也是一份鼓励哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值