程序设计-寻找三数之和为零的三元组(Java)

程序设计-寻找三数之和为零的三元组(Java)分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.netpackagelive.every.day.Programming;importjava.util.ArrayList;importjava.util.Arrays;/***给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a、b、c,使得a+b+c=0。*找出所有满足条件且不重复的三元组。**@auth

大家好,又见面了,我是你们的朋友全栈君。

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

package live.every.day.Programming;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a、b、c,使得a+b+c=0。
 * 找出所有满足条件且不重复的三元组。
 *
 * @author Created by LiveEveryDay
 */
public class ThreeNumbersSumEqualsZero {

    public static ArrayList<ArrayList<Integer>> solve(int[] nums) {

        // 三元组用ArrayList<Integer>来表示
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();

        if (nums == null || nums.length == 0) {
            return result;
        }

        // 排序
        Arrays.sort(nums);

        for (int i = 0; i < nums.length - 2; i++) {

            // 避免计算重复元素
            if (i != 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            /**
             * 固定一个数,从后面的数中选出两个数。
             * 因为数组是有序的,所以可以用两个数组下标left和right,left指向当前元素的后一个位置,right指向数组的最后一个位置。
             * 三数相加的和等于0时,加入解集;
             * 三数相加的和小于0时,把left往右边移动;
             * 三数相加的和大于0时,把right往左边移动。
             */
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == 0) {
                    ArrayList<Integer> r = new ArrayList<>();
                    r.add(nums[i]);
                    r.add(nums[left]);
                    r.add(nums[right]);
                    result.add(r);
                    left++;
                    right--;

                    // 避免计算重复元素
                    while (left < right && nums[left] == nums[left - 1]) {
                        left++;
                    }

                    // 避免计算重复元素
                    while (left < right && nums[right] == nums[right + 1]) {
                        right--;
                    }
                } else if (sum < 0) {
                    left++;
                } else {
                    right--;
                }
            }
        }
        return result;
    }

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

        int[] nums2 = {0};
        System.out.println(solve(nums2));

        int[] nums3 = {1, 2, 3, 4, 5, 6};
        System.out.println(solve(nums3));
    }

}

// Output:
/*
[[-1, -1, 2], [-1, 0, 1]]
[]
[]
*/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151780.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Z平台-开源免费的JAVA快速开发平台

    Z平台-开源免费的JAVA快速开发平台Z平台是开源免费的JavaWeb快速开发平台。通过Z平台集成开发环境,以零编码、动态配置的方式能够快速开发出各类Web管理系统。Z平台框架组成所用到的各种功能组件与框架,都是开源免费的,不涉及到版权问题,商业与非商业项目都可以使用。

    2022年5月14日
    50
  • 动态网页爬虫

    动态网页爬虫网页加载数据的另一种方式——通过API(ApplicationProgrammingInterface,应用程序编程接口)加载数据网页通过API获取数据,实时更新内容,它规定了网页与服务

    2022年7月1日
    26
  • 非递归方式实现二叉树后序遍历_二叉树递归遍历

    非递归方式实现二叉树后序遍历_二叉树递归遍历二叉树前序遍历对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢?请看大屏幕。。。。上图是一棵二叉树,前序遍历结果:124536咦,我想你可能会异或什么叫做前序遍历,其实很简单,就是按照根-》左-》右的方式去遍历二叉树。首先让我们来看看如何递归的去前序遍历二叉树注:在这里我特别强调一点,在我们二…

    2025年10月21日
    3
  • 近期技术讨论贴(持续更新:12-10)

    近期技术讨论贴(持续更新:12-10)http://bbs.blueidea.com/thread-2455309-1-1.html转载于:https://www.cnblogs.com/jikey/archive/2009/12/24/1631436.html

    2022年6月24日
    24
  • python读取txt文件内容(python怎么读取excel)

    python读取txt文件的方法:首先打开文件,代码为【f=open(‘/tmp/test.txt’)】;然后进行读取,代码为【本教程操作环境:windows7系统、python3.9版,该方法适用于所有品牌电脑。python读取txt文件的方法:一、文件的打开和创建>>>f=open(‘/tmp/test.txt’)>>>f.read()’hell…

    2022年4月14日
    51
  • java.net.DatagramSocket

    java.net.DatagramSocket此类表示用于发送和接收数据报包的套接字。数据报套接字是分组传送服务的发送或接收点。在数据报套接字上发送或接收的每个数据包都是单独寻址和路由的。从一台机器发送到另一台机器的多个分组可以被不同地路由,并且可以以任何顺序到达。在可能的情况下,新构造DatagramSocket的SO_BROADCAST插座选项已启用,以便允许广播数据报的传输。为了接收广播数据包,应将DatagramSocket绑…

    2022年5月20日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号