LeetCode第15题 三数之和

/*

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

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

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

满足要求的三元组集合为:  [  [-1, 0, 1],  [-1, -1, 2]  ]*/
/*  思路:  首先想到的肯定是穷举,时间复杂度为O(n^3) , 但如果使用这种方法,也实在称不上算法题了,果不其然,超时.

[-1, 0, 1, 2, -1, -4] 对于这个数组,可以先固定一个数,然后判断其他2个数的和是否与这个数相反,如果         相反,自然就是一个解.      ****先排序****         首先固定一个数,这个题中,从下标i=0开始,一直到length - 3.(因为固定的这个数右面起码有2个位置留给另外2个数用于求和的.)         另外两个数分别从 pos = i+1,和pos = length - 1 开始,向中间遍历,求和sum,分析和.         1.如果sum与固定的数刚好相反,加入到解中。但也要考虑到去重的问题:如果这个数和接下来的数相同,就跳过         2.如果sum大于固定的数,就让sum变小 , right++         3.如果sum小于固定的数,就让sum变大 , left++         时间复杂度为O(n^2)

*/
 1 class Solution15 {
 2
 3   public List<List<Integer>> threeSum(int[] nums) {
 4     List<List<Integer>> res = new ArrayList<>();
 5     if (nums == null || nums.length < 3) {
 6       return res;
 7     }
 8     Arrays.sort(nums);
 9     for (int i = 0; i < nums.length - 2; i++) {
10       if (i > 0 && nums[i] == nums[i - 1]) {   //剪枝,如果这一步不进行剪枝,会产生重复解
11         continue;
12       }
13       if (nums[i] > 0) {
14         break;
15       }
16       int left = i + 1;
17       int right = nums.length - 1;
18       while (left < right) {
19         int sum = nums[left] + nums[right];
20         if (sum + nums[i] == 0) {    //加入到解中,并剪枝(while),如果这一步不进行剪枝,会产生重复解
21           res.add(Arrays.asList(nums[i], nums[left], nums[right]));
22           while (left < right && nums[left] == nums[left + 1]) {
23             ++left;
24           }
25           while (right > left && nums[right] == nums[right - 1]) {
26             --right;
27           }
28           ++left;
29           --right;
30         } else if (sum + nums[i] < 0) {   //如果和小于0,让和变大一些
31           ++left;
32         } else {    //如果和大于0,让和变小一些
33           --right;
34         }
35       }
36     }
37     return res;
38   }
39 }

原文地址:https://www.cnblogs.com/rainbow-/p/10260538.html

时间: 2024-10-11 03:38:08

LeetCode第15题 三数之和的相关文章

LeeCode数组第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)去重复对于第一个小问题,首先考虑三个for循

[LeetCode] 3Sum Closest 最近三数之和

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

[leetcode数组系列]2三数之和

前言 秋招的结束,面试了大大小小的公司,最大的问题在于算法上.所以打算坚持在leetcode打卡,看看到底能不能行,如果你想见证,那我来开车,你坐稳,一起走向更好的远方. 在学习今天内容之前,先学习上一篇的两数之和会更好哟 leetcode两数之和求解 一 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满

15、三数之和 #leetcode

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] lass Solution(object): def threeSum(self, nums): """ :type

[LeetCode] 16. 3Sum Closest 最近三数之和

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

【LeetCode每天一题】3Sum(三数之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. Example: Given array nums =

LeetCode(15):三数之和

Medium! 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 解题思路: 这道题让我们求三数之和,比之前那道Two Sum要复杂一些,考虑过先fix一个数,然后另外两个数使

15.三数之和——LeetCode

1 package threesum; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 /** 8 * 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 9 * 注意:答案中不可以包含重复的三元组 10 * 11 * 主要的思想:如果采用暴力法的话,时间复杂

LeetCode第十六题-找出数组中三数之和最接近目标值的答案

3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nums=[-1, 2, 1, -4], 目标值:target = 1. 最接近目标值的答案是2 (-1 + 2 + 1 = 2). 解法一: 与上一道题类似,这次要求的是三数之和与目标值的差值最小值,可以定义一个变量来记录这个差值 思路就是想先定义一个最接近的值默认取前三个数的合,然后将数组排序后 小