题目

给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。

样例

例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=. 满足要求的四元组集合为:

(-1, 0, 0, 1)

(-2, -1, 1, 2)

(-2, 0, 0, 2)

注意

四元组(a, b, c, d)中,需要满足a <= b <= c <= d

答案中不可以包含重复的四元组。

解题

怎么感觉下面程序已经没法修改了但是在39%测试数据时候超时

public class Solution {
/**
* @param numbers : Give an array numbersbers of n integer
* @param target : you need to find four elements that's sum of target
* @return : Find all unique quadruplets in the array which gives the sum of
* zero.
*/
public ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target) {
//write your code here
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length < 4)
return result;
Arrays.sort(numbers);
for(int i=0;i< numbers.length - 1 ; i++){
if(numbers[i]==numbers[i+1])
continue;
for(int j = numbers.length - 1;j>i ;j--){
if(numbers[j] == numbers[j-1])
continue;
int left = i + 1;
int right = j - 1;
int n = target - numbers[i] - numbers[j];
while(left< right){
while(numbers[left] == numbers[++left] && left<right);
left--;
while(numbers[right] == numbers[--right] && left<right);
right++; int sum = numbers[left] + numbers[right];
if(n==sum){
ArrayList<Integer> path = new ArrayList<Integer>();
path.add(numbers[i]);
path.add(numbers[left]);
path.add(numbers[right]);
path.add(numbers[j]);
if(!result.contains(path))
result.add(path);
}
else if(sum<target){
left++;
}else{
right--;
}
}// end while
}// end for
}// end for
return result;
}
}

Java Code

九章上面的代码,感觉和上面的明明差不多,但是就能通过

public class Solution {
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num); for (int i = 0; i < num.length - 3; i++) {
if (i != 0 && num[i] == num[i - 1]) {
continue;
} for (int j = i + 1; j < num.length - 2; j++) {
if (j != i + 1 && num[j] == num[j - 1])
continue; int left = j + 1;
int right = num.length - 1;
while (left < right) {
int sum = num[i] + num[j] + num[left] + num[right];
if (sum < target) {
left++;
} else if (sum > target) {
right--;
} else {
ArrayList<Integer> tmp = new ArrayList<Integer>();
tmp.add(num[i]);
tmp.add(num[j]);
tmp.add(num[left]);
tmp.add(num[right]);
rst.add(tmp);
left++;
right--;
while (left < right && num[left] == num[left - 1]) {
left++;
}
while (left < right && num[right] == num[right + 1]) {
right--;
}
}
}
}
} return rst;
}
}

Java Code

在对比两个程序发现,确实有错误,最重要的还是,在sum==target 的时候left和right 没有变化,其他的小错误是在参考网上程序时候没有改完

改成下面的程序但是还是在78% 的测试数据时候有错误。

public class Solution {
/**
* @param numbers : Give an array numbersbers of n integer
* @param target : you need to find four elements that's sum of target
* @return : Find all unique quadruplets in the array which gives the sum of
* zero.
*/
public ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target) {
//write your code here
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length < 4)
return result;
Arrays.sort(numbers);
for(int i=0;i< numbers.length - 4 ; i++){
for(int j = numbers.length - 1;j>i ;j--){
int left = i + 1;
int right = j - 1;
while(left< right){ int sum = numbers[i] + numbers[j] + numbers[left] + numbers[right];
if(target==sum){
ArrayList<Integer> path = new ArrayList<Integer>();
path.add(numbers[i]);
path.add(numbers[left]);
path.add(numbers[right]);
path.add(numbers[j]);
if(!result.contains(path))
result.add(path);
left++;
right--;
}
else if(sum<target){
left++;
}else{
right--;
}
}// end while
}// end for
}// end for
return result;
}
}

Java Code

在网上看到别人程序对第一四个数据进行去重,感觉这个是有问题的,比如:-1 -1 1 1, -1 -1 -1 3  这个也是个答案的,但是上面九章给的程序确实是由去重的操作。。。。

仔细看九章的程序,发现:

1,i是第一个数,j是第二个数,Start是第三个数,End是第四个数

2.,前两个数进行了去重,对计算过的Start和End也进行了去重,start和End去重很好理解,但是对于前两个数去重我就不能理解了

3.上面78%报错的程序修改成九章的,在39%处报错,去除前两个去重的程序,还是在78%出报错,但是我发现在target==92的时候我的程序输出的结果有75个值和正确答案是一样的。至于为什么我还是不明白,四个数的顺序应该是没有影响的,如果不去重只是多运行几次,但是不至于报错的。。。。但是这里还是有了影响。

lintcode:四个数之和的更多相关文章

  1. 18 4Sum(寻找四个数之和为指定数的集合Medium)

    题目意思:给一个乱序数组,在里面寻找三个数之和为target的所有情况,这些情况不能重复,增序排列 思路:采用3Sum的做法 ps:有见一种用hash的,存任意两个元素的和,然后变成3sum问题,需要 ...

  2. [LeetCode] 4Sum II 四数之和之二

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  3. ACM_四数之和

    四数之和 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个不同的整数,判断能否从中选4次,4个数和刚好为m.数字可重复选取. ...

  4. [LeetCode] 454. 4Sum II 四数之和之二

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  5. [LeetCode] 454. 4Sum II 四数之和II

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...

  6. 【LeetCode】 454、四数之和 II

    题目等级:4Sum II(Medium) 题目描述: Given four lists A, B, C, D of integer values, compute how many tuples (i ...

  7. 【LeetCode】四数之和

    [问题]给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找 ...

  8. Leetcode(18)-四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...

  9. 【LeetCode】18. 4Sum 四数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:four sum, 4sum, 四数之和,题解,leet ...

随机推荐

  1. 而在Jquery中则使用$.map()、$.each()来操作数组

    首先是普通的数组(索引为整数的数组): //$.map(arr,fn); //对数组中的每个元素调用fn函数逐个进行处理,fn函数将处理返回最后得到的一个新的数组 var arr = [9, 8, 7 ...

  2. jQuery实现公告文字左右滚动

    jQuery实现公告文字左右滚动的代码. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  3. JS定时器实例解析

    在javascritp中,有两个关于定时器的专用函数. 分别为:1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...

  4. 重拾C,一天一点点_3

    按位运算 C语言提供了6个位操作运算符,只能作用于整型操作数,即只作用于带符号或无符号的char.short.int.long. &    按位与(AND) !      按位或(OR) ^  ...

  5. ASP 连接 MySQL 数据库两种方法

    一般都是用myodbc来连接.首先,在系统中安装 Mysql 的ODBC数据库驱动.如安装稳定版本是3.51.下载地址是:http://dev.mysql.com/downloads/connecto ...

  6. WPF之旅(一)- 概述

    WPF与之前出现的其他技术相比引入了“内置硬件加速”和“分辨率无关”等创新功能.WPF是一种成熟的技术,它是几个已经发布的.NET平台的一部分,并通过几个版本不断地进行完善(WPF3.0 -> ...

  7. hdu 5720 BestCoder 2nd Anniversary Wool 推理+一维区间的并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5720 题意:有n(n <= 105)个数 ,每个数小于等于 1018:问在给定的[L,R]区间中 ...

  8. mysql绿色版安装问题解决(ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061))

    原来一直是使用MySQL安装版没有出现过问题,今天在安装绿色版MySQL时出现了点问题 在安装成windows服务成功后,用net start mysql 启动时提示启动成功,但当我连接mysql就报 ...

  9. 关于qt5在win7下发布 & 打包

    QT5 发布时,莫过于依赖动态链接库(dll) , 但是,QT5的动态链接库貌似都有2套 ,例如 Qt5Core (针对realese) , Qt5Cored (针对debug) ,凡事末尾带d的都是 ...

  10. Pomodairo,番茄工作法-应用篇

    传统:              选择一个待完成的任务              将番茄时间设为适合自己的固定时间              专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响 ...