我是靠谱客的博主 强健中心,最近开发中收集的这篇文章主要介绍三数之和,求三个数之和为0(双指针法),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一步需要定义数组数据和main方法

  public static void main(String[] args) {
        int[] input = {-1, 0, 1, 2, -1, -4};
        ThreeFem threeFem = new ThreeFem();
        System.out.println(threeFem.threeFem(input));
    }

第二步定义数组长度和排序

  int n = nums.length;
        List<List<Integer>> result = new ArrayList<>();
        //先对数组排序(nlogn复杂度)
        Arrays.sort(nums);

循环遍历数组,我们筛选三元数组中最小的值作为i指针,固定 3 个指针中最左(最小)数字的指针 i,双指针 LR 分设在数组索引 (i, len(nums)) 两端,所以初始值,i=0L=i+1R=nums.length-1;

 //定义指针
            int lp = i + 1;
            int rp = n - 1;

接下来需要先考虑特殊情况了。

1.1如果当前的i指针指向的数已经大于0了,直接退出循环

for (int i = 0; i < n; i++) {
            //1.1首选处理特殊情况,如果当前数已经大于0,直接退出循环
            if (nums[i] > 0) {
                break;
            }
....

1.2我愿称之为去重

  //1.2如果当前数据已经出现过,直接跳过
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

1.3接下来就是判断是左右指针移动问题,只要左右指针不重叠,就继续移动;

循环计算当前三数之和:

sum = nums[i] + nums[L] + nums[R]

并按照以下规则执行双指针移动:

  1. sum < 0时,L ++并跳过所有重复的nums[L]
  2. 由于sum<0L一直右移,直到跟R重合。如果依然没有结果,那么i++,换下一个数考虑
  3. 初始同样还是L=i+1R=nums.length-1。同样,继续判断sum

  4. 找到一组解之后,继续移动LR,判断sum,如果小于0就右移L,如果大于0就左移R
  5. 如果LR相遇或者L>R,代表当前i已经排查完毕,i++;如果i指向的数跟i-1一样,那么直接继续i++,考察下一个数;整体代码如下
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    public class ThreeFem {
        public static void main(String[] args) {
            int[] input = {-1, 0, 1, 2, -1, -4};
            ThreeFem threeFem = new ThreeFem();
            System.out.println(threeFem.threeFem(input));
        }
    
    
        public List<List<Integer>> threeFem(int[] nums) {
            int n = nums.length;
            List<List<Integer>> result = new ArrayList<>();
            //数组排序
            Arrays.sort(nums);
            for (int i = 0; i < n; i++) {
                if (nums[i] > 0) {
                    break;
                }
                //去重
                if (i > 0 && nums[i] == nums[i - 1]) {
                    continue;
                }
                //定义指针
                int lp = i + 1;
                int rp = n - 1;
                while (lp < rp) {
                    int sum  = nums[i] + nums[lp] + nums[rp];
                    if(sum == 0 ){
                        result.add(Arrays.asList(nums[i],nums[lp],nums[rp]));
                        lp ++;
                        rp --;
                        //去重
                        while (lp < rp && nums[lp] == nums[lp - 1]){
                            lp++;
                        }
                        while (lp < rp && nums[rp] == nums[rp +1]) {
                            rp--;
    
                        }
    
    
                    }else if(sum < 0 ){
                        lp++;
                    }else {
                        rp--;
                    }
    
                }
            }
    
    
            return result;
        }
    }
    

最后

以上就是强健中心为你收集整理的三数之和,求三个数之和为0(双指针法)的全部内容,希望文章能够帮你解决三数之和,求三个数之和为0(双指针法)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部