zoukankan      html  css  js  c++  java
  • 15#三数之和

    题目描述

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

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

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]
    

    思路

    1. 先把数组排序
    2. 从小到大遍历这个数组,每次取一个元素,将这个元素的相反数设为target
    3. 在每次遍历中,使用双指针对当前元素的后面的所有元素进行处理,找到两个元素的和为target,这样,三个元素的和就是 0
    4. 双指针的具体处理方式为:头尾各一个指针,每次判断两个指针所指的元素的和与target的大小,如果和小了,左指针右移;如果和大了,右指针左移,直到两个指针相遇

    注意

    • 在第 2 条中,遍历数组的次数不是整个数组的长度,只需要遍历至倒数第 3 个元素,因为是考察 3 个元素的和
    • 因为不能有重复的结果,所以前后两次遍历取的元素如果相等,要采取跳过的操作

    源代码

    class Solution {
        public List<List<Integer>> threeSum (int[] nums) {
            List<List<Integer>> ans = new ArrayList<>();
            if (nums.length < 3) {
                return ans;
            }
    
            Arrays.sort(nums);
    
            for (int i = 0; i + 2 < nums.length; i++) {
                if (i > 0 && nums[i] == nums[i - 1]) {
                    continue; // skip same result
                }
                int j = i + 1;
                int k = nums.length - 1;
                int target = -nums[i];
                while (j < k) {
                    if (nums[j] + nums[k] == target) {
                        ans.add(Arrays.asList(nums[i], nums[j], nums[k]));
                        j++;
                        k--;
                        while (j < k && nums[j] == nums[j - 1]) j++; // skip same result
                        while (j < k && nums[k] == nums[k + 1]) k--; // skip same result
                    } else if (nums[j] + nums[k] < target) {
                        j++;
                    } else {
                       k--;
                    }
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    缓存
    json集合取值
    四个div块点击某个突出显示
    table获取某一列的td
    鼠标悬浮tr追加背景颜色
    jquery弹出层
    面试题
    表单校验及正则表达式
    jquery操作DOM
    jquery的事件与动画
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/10190361.html
Copyright © 2011-2022 走看看