• LeetCode15:三数之和


    1.题目来源

    力扣15题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    链接:https://leetcode-cn.com/problems/3sum/

    2.解题思路

    a.这个题目的重点在于不重复,凡是要求不重复的题目,都可以使用先排序,Array.sort()大法真好用,嘻嘻。然后按照顺序一个个来的方法,这样就不会有重复的组合了。

    b.首先找出第一个数,然后剩下两个数之和就是第一个的相反数。基于此,剩下两个数的寻找可以使用寻找两数之和为固定数的算法。

    c.寻找两数之和为固定数可以先排序,然后用双指针找。

    d.也就是在数组中要找到3个数,这个3个数之间可以重复,但是每一个的取值不能重复。

    3.代码展示

    public class Solution {
    
        public static List<List<Integer>> threeSum(int[] nums) {
            int numLength = nums.length;
            List<List<Integer>> result = new ArrayList<>();
            if (numLength == 0) {
                return result;
            }
            // 1.排序
            Arrays.sort(nums);
            for (int first = 0; first < numLength; ++first) {
                // 第一个数只能取一次,所以不能和上一个相等
                if (first > 0 && nums[first] == nums[first - 1])
                    continue;
                int third = numLength - 1;
    
                int target = -nums[first];
                for (int second = first + 1; second < numLength; ++second) {
                    // 第二个数也只能取一次,所以不能和上一个相等,second > first + 1是因为是每一位数的取值不相同,但是不同位数之间可以相同
                    if (second > first + 1 && nums[second] == nums[second - 1])
                        continue;
                    // second和third还没相遇,并且两数之和大于目标值,让third减小以寻找目标值
                    while (second < third && nums[second] + nums[third] > target) {
                        third--;
                    }
                    // 两个指针都相遇了仍然比目标值大,说明找不到那个数
                    if (second == third) {
                        break;
                    }
                    // 寻找到对应的数字和为目标值
                    if (nums[second] + nums[third] == target) {
                        List<Integer> template = new ArrayList<>();
                        template.add(nums[first]);
                        template.add(nums[second]);
                        template.add(nums[third]);
                        result.add(template);
                    }
                }
    
            }
            return result;
        }
    
        public static void main(String[] args) {
            int[] array = {-1, 0, 1, 2, -1, -4};
            List<List<Integer>> result = threeSum(array);
            System.out.println(result);
        }
    }

    写完代码写用例要写多个,除了题目中给出的,至少要加上特殊值用例,如:空数组

  • 相关阅读:
    检测是否安装了新包
    redux和mobx的比较
    ssh登录远程服务器
    法律
    如何解决二方包彼此依赖?
    创业
    【转】裸辞4个月,面试30家公司。
    添加群机器人
    RESTful状态码说明
    MongoDB简单介绍以及基本命令
  • 原文地址:https://www.cnblogs.com/neverland0718/p/14448957.html
Copyright © 2020-2023  润新知