LeetCode 15 3Sum 找出数组里面3个数的和等于指定值。

题目:Given an array S of n integers,
are there elements a, b, c in S such
that a + b + c =
0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

翻译: 给一个数组。找出其中3个数字等于0的组合。 按升序排列。

思路:这道题和前些天刷的Two Sum 原理差不多。只不过是Two Sum的和是前一个数字的相反数。还有一个问题就是,如果当前数字和下一个数字重复,应该排除这些重复,不遍历,减少复杂度。

代码:

public static ArrayList<ArrayList<Integer>> threeSum(int[] num)
	{
		ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
		if(num == null||num.length<3)//如果只有2个数字 或者为空 返回空
			return res;
		Arrays.sort(num);
		for(int i = 0; i<num.length -2;i++)// 保证最后得有num.length-1 和num.length-2两个数,才可以进循环
		{
			if(i > 0 && num[i] == num[i-1])//如果要是有重复的直接跳过。
				continue;
			ArrayList<ArrayList<Integer>> cur = twoSum(num,i+1,-num[i]); //得到当前数字可以组合出来的数字序列的子集。
			res.addAll(cur);
		}

		return res;
    }
    public static ArrayList<ArrayList<Integer>>twoSum (int []num,int start,int target)
    {

    	ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    	if(num == null||num.length < 2)
    		return res;
    	int l = start;//起始位置
    	int pri = start-1;//当前数字
    	int r = num.length-1;//终止位置
    	while(l < r)//采用夹逼,逼近target
    	{
    		if(num[l]+num[r] == target)//
    		{
    			ArrayList<Integer> te = new ArrayList<Integer>();//符合的话 把三个数放入到list中
    			te.add(num[pri]);
    			te.add(num[l]);
    			te.add(num[r]);
    			res.add(te);
    			int k = l + 1;//从l的下一个开始 去除重复。
    			while(k < r&& num[k] == num[l])
    				k++;
    			l = k;
    			k = r - 1;//去除R的重复
    			while(k > l &&num[k] == num[r])
    				k--;
    			r = k;
    		}
    		else if(num[l] + num[r] > target)//夹逼
    			r--;
    		else l++;
    	}

		return res;

    }

如果要是求4 sum的话 直接可以在写个函数求出3 sum的 然后在整合到4sum中。原理其实差不多。

更好的办法,还有待考虑。

时间: 2024-09-29 17:05:41

LeetCode 15 3Sum 找出数组里面3个数的和等于指定值。的相关文章

找出数组中每个数右边第一个比它大的元素

题目 找出数组中每个数右边第一个比它大的元素. 思路 暴力解法 单调栈 使用栈结构.从前往后遍历数组每一位时,利用栈更新这一位之前每一位上的数的"右边第一个比它大的元素". 代码 public static int[] findMaxRightWithStack(int[] array) { if(array == null) return null; int n = array.length; int[] ret = new int[n]; Stack<Integer>

在给定数组中,找出最先满足两个数的和等于给定数,输出这两个元素的下表

leetcode上的一道题目,虽然不难,但是考察了数据结构中很多的知识 Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4

1142: 零起点学算法49——找出数组中最大元素的位置(下标值)

1142: 零起点学算法49--找出数组中最大元素的位置(下标值) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1937  Accepted: 977[Submit][Status][Web Board] Description 找出数组中最大的元素的下标. Input 多组测试,每组先输入一个不大于10的整数n 然后是n个整数 Output 输出这n个整数中最大的元素及下标值 Sample I

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

面试题---找出数组中两个只出现一次的数

题目描述:给一个数组,里面有两个数只出现一次,其它的数都出现两次,请找出这两个数: 样例:输入 2 4 2 7 4 9 输出 7 9 思路:假定要找出的这两个数为x.y   把所有的数异或,结果是x与y异或的值,那么肯定不为0,那么这个值的二进制至少有一位为1,也就是说x和y的二进制在这一位上必定一个为0,一个为1,那么可以根据这一位把这个数组分成两个数组,x和y在不同的数组里,接下来对每个数组直接异或出的值就是结果了: 代码如下: #include <iostream> #include &

[算法]找出数组当中的中枢元素

给定一个整型数组,找出pivot,使得对于任意i < pivot,a[i] <=a[pivot],对于i > pivot,a[i]>=a[pivot],只能用一个额外的数组,和少量空间. 思路 1.使用一个数组t记录,t[i]记录的是a[0]~a[i]的最大值 int *t = new int[n]; for(int i = 0, max = ~0; i < n; ++i){ if(a[i] > max){ max = a[i]; } t[i] = max; } 2.从

水贴王之续,找出数组里出现频率最高的元素

找出数组里出现频率最高的元素 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 博客内容:水贴王问题之续 博客时间:2014-5-12; 编程语言:Java ; 编程坏境:Windows 7 专业版 x64; 编程工具:jdk,eclipse x64; 制图工具:office 2007 powerpoint; 硬件信息:7G-3 笔记本; 真言: 痛苦的活着比