栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

剑指 Offer II 007. 数组中和为 0 的三个数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指 Offer II 007. 数组中和为 0 的三个数

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:

输入:nums = []
输出:[]
示例 3:

输入:nums = [0]
输出:[]

提示:

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1fGaJU
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

是双指针的变形,我们知道双指针法的时间复杂度就是 On 那么,三指针就是在一个指针固定的前提下,移动另外两个指针,时间复杂度是 On2,此题并没有明确数组是排好序的,所以,先排序,时间复杂度是 onlogn + O n2,结果还是 n2,思路如下:

当数组长度大于 3 的时候,先排序,然后从 0 - nums.length - 2 的这个区间范围内固定指针,然后另外俩指针在后面搜,注意,本题的难点其实是去重问题,如果出现相同的数字,那么如果不做处理,得到的结果就会有重复的情况,所以,每次固定 i 指针的时候,需要先判断下一个元素是否等于 i,如果还等于,再往后固定。

同理,定义 j 指针的时候以同样的方法来。

class Solution {
    List> result = new linkedList>();
    public List> threeSum(int[] nums) {
        if (nums.length >= 3) {
            Arrays.sort(nums);
            int i = 0;
            while (i < nums.length - 2) {
                twoSum(nums, i);
                int temp = nums[i];
                while (i < nums.length && temp == nums[i]) {
                    i++;
                }
            }
        }
        return result;
    }
    private void twoSum(int[] nums, int i) {
        int j = i + 1;
        int k = nums.length - 1;
        while (j < k) {
            int sum = nums[i] + nums[j] + nums[k];
            if (sum == 0) {
                result.add(Arrays.asList(nums[i], nums[j], nums[k]));
                int temp = nums[j];
                while (j < k && nums[j] == temp) {
                    j++;
                }
            } else if (sum > 0) {
                k--;
            } else {
                j++;
            }
        }
    }
    
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685047.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号