美文网首页
Java算法题:三数之和

Java算法题:三数之和

作者: 会九卦的兔子 | 来源:发表于2018-07-31 22:00 被阅读0次

题目来自:https://leetcode-cn.com/problems/3sum/description/

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

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

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

满足要求的三元组集合为:

[

  [-1, 0, 1],

  [-1, -1, 2]

]

思路:

        这道题挺简单的。

        首先要明白一个三元组关系 a>=b>=i 所以首先就是把数组按从小到大重新排序。

        了解 二元组的和等于给定值sum 情况的话,就知道数组排序后,用两个指向数组的指针,一个从前向后扫描,一个从后向前扫描,记为first和last;

        当 first + last == sum 则找到了一对二元组,它们的和等于sum;

        如果 first + last < sum 则再去取左边更大的值,所以 first++;

        如果 first + last > sum 则再去取右边更小的值,所以 last-- 。

        同样,三元组的情况,先将数组从小到大排序,然后固定一个元素 chooiseNum ,再去寻找一个二元组的和为sum + chooiseNum == 0 ,这样就将三元组的问题,转换成了二元组的问题。

private static int[] num = {-1, 0, 1, 2, -1, -4};

public static void main(String[] args) {

        sortNums(num);

        System.out.print("排序后的数组:");

        for (int i = 0; i < num.length; i++) {

                    System.out.print(num[i] + " ");

        }

        System.out.println(" ");

        solutionThirdNum(num);

}

public static void solutionThirdNum(int[] nums) {

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

                    int chooiseNum = nums[i];

                    int left = 0, right = nums.length-1;

                    while(left < right) {

                            int sum = nums[left] + nums[right];

                            if(i == left || i == right) {

                                    break;

                            }

                            if(chooiseNum + sum < 0) {

                                    left++;

                                    continue;    

                            }

                            if(chooiseNum + sum > 0) {

                                    right--;

                                    continue;

                            }

                            if(chooiseNum + sum == 0) {

                                        if(left >= i ) {

                                        System.out.println(" [ " + nums[i] + ","+  nums[left] +"," + nums[right] + " ]");

                                        }

                                        if(left < i && i < right) {

                                            System.out.println(" [ " + nums[left] + ","+  nums[i] +"," + nums[right] + " ]");

                                        }

                                        if(right <= i) {

                                                System.out.println(" [ " + nums[left] + ","+  nums[right] +"," + nums[i] + " ]");

                                        }

                                        break;

                            }

                    }

        }

}

// 冒泡排序--> 从小到大

public static int[] sortNums(int[] sortNum) {

            for (int i = 0; i < sortNum.length - 1; i++) {

                    for (int j = 0; j < sortNum.length - i - 1; j++) {

                            if (sortNum[j] > sortNum[j + 1]) {

                                int temp = sortNum[j];

                                sortNum[j] = sortNum[j + 1];

                                sortNum[j + 1] = temp;

                                }

                        }

                }

                return sortNum;

}

相关文章

  • Java算法题:三数之和

    题目来自:https://leetcode-cn.com/problems/3sum/description/ 给...

  • ATRS第1周

    ATRS Algorithm算法题: 两数之和 - 力扣 (LeetCode) ``` function twoS...

  • leetcode算法题:三数之和

    给定一个包含n个整数的数组 nums,判断 nums中是否存在三个元素a,b,c ,使得a + b + c =0 ...

  • leetcode No.16 3Sum Closest(最接近的

    题干: 效果: 思路: 这道题跟No.15很像,就是要找三数之和,但15是找三数之和为0,这题是找离target最...

  • 算法题-两数之和

    题目描述: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们...

  • LeetCode-15 三数之和

    题目:15. 三数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第15题三数之和,这是一道中等题。像...

  • 【算法】三数之和

    【算法】三数之和 1、题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,...

  • 两数之和&三数之和&四数之和&K数之和

    今天看了一道谷歌K数之和的算法题,忽然想起来之前在力扣上做过2、3、4数之和的题,觉得很有必要来整理一下。其实2、...

  • LeetCode15 三数之和(Java实现)

    LeetCode15 三数之和(Java实现) 题目描述: 代码:

  • 两数之和(golang)

    原题:两数之和 关联:两数之和 II - 输入有序数组(golang)两数之和 IV - 输入 BST(golang)

网友评论

      本文标题:Java算法题:三数之和

      本文链接:https://www.haomeiwen.com/subject/xagqvftx.html