[LeetCode][Java] 4Sum
题目:
Given an array S of n integers, are there elements a, b, c, and d in S such
that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
A solution set is:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
题意:
给定一个包括n个整数的数组S,在数组S中是否存在元素a,b,c和d,使得 a + b + c + d =
target.找出数组S中全部这种组合。
注意:
1.这四个元素必须是升序排列(ie, a ≤ b ≤ c ≤ d)
2.终于结果中不嫩包括反复的解。
For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
A solution set is:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
算法分析:
* 利用了题目《3Sum》的代码 https://leetcode.com/problems/3sum/
* 首先升序排列数组,然后从第一个元素開始依次遍历《3Sum》算法,目标值为(target-nums[i]),遍历的数组为该元素后面的数组
* 这样既满足终于的arraylist中元素升序排列,也不会出现反复。由于每次以其为開始。进行遍历的元素都是数组中的最小的元素
AC代码:
public class Solution
{
private static ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> fourSum(int[] nums, int target)
{
int newtarget=0; ArrayList<ArrayList<Integer>> finalres = new ArrayList<ArrayList<Integer>>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++)
{
ArrayList<ArrayList<Integer>> temlist= new ArrayList<ArrayList<Integer>>();
if (i > 0 && nums[i] == nums[i-1]) continue;//避免结果反复,其后面和它相等的直接被跳过。
newtarget=target-nums[i];
int inputnums[]=new int[nums.length -i-1];
for(int ii=0;ii<nums.length -i-1;ii++)
inputnums[ii]=nums[ii+1+i];//每次选取该元素后面的数组作为《3sum》算法的输入数组
temlist=threeSum(inputnums,newtarget,nums[i]); finalres.addAll(temlist);
ret.clear();
}
return finalres; }
public static ArrayList<ArrayList<Integer>> threeSum(int[] num,int newtarget,int firstnum)
{
if (num == null || num.length < 3) return ret; Arrays.sort(num); int len = num.length;
for (int i = 0; i < len-2; i++)
{
if (i > 0 && num[i] == num[i-1]) continue;//避免结果反复,其后面和它相等的直接被跳过。
find(num, i+1, len-1, num[i],newtarget, firstnum); //寻找两个数与num[i]的和为0
} return ret;
} public static void find(int[] num, int begin, int end, int target,int newtarget,int firstnum)
{
int l = begin, r = end;
while (l < r)
{
if (num[l] + num[r] + target == newtarget)
{
ArrayList<Integer> ans = new ArrayList<Integer>();
ans.add(firstnum);//与原始的《3Sum》算法不同的地方为:记得把每次的启发遍历元素增加进去。就是4个数中的最小的那一个
ans.add(target);
ans.add(num[l]);
ans.add(num[r]);
ret.add(ans); //放入结果集中
while (l < r && num[l] == num[l+1]) l++;//避免结果反复,其后面和它相等的直接被跳过。
while (l < r && num[r] == num[r-1]) r--;////避免结果反复,其后面和它相等的直接被跳过。
l++;
r--;
}
else if (num[l] + num[r] + target < newtarget)
l++;
else
r--;
}
}
}
[LeetCode][Java] 4Sum的更多相关文章
- [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 ...
- N-Queens II leetcode java
题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...
- leetcode 日记 4sum java
整体思路同之前的一样,依然采取降低维度的方式进行 public List<List<Integer>> solution(int nums[], int target) { L ...
- 【JAVA、C++】LeetCode 018 4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- Java [leetcode 18]4Sum
问题描述: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ...
- leetcode 18 4Sum JAVA
题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出 ...
- LeetCode 18 4Sum (4个数字之和等于target)
题目链接 https://leetcode.com/problems/4sum/?tab=Description 找到数组中满足 a+b+c+d=0的所有组合,要求不重复. Basic idea is ...
- [LeetCode] 18. 4Sum 四数之和
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- LeetCode 18. 4Sum (四数之和)
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
随机推荐
- 神奇的Object.defineProperty
vue.js和avalon.js 都是通过它实现双向绑定的. 对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj={}; o ...
- 树莓派+百度api实现人脸识别
title: 树莓派+百度api实现人脸识别 tags: 树莓派 date: 2018-5-31 20:06:00 --- 树莓派对接百度api 我以前玩安卓的时候一直用的讯飞的平台和api,对于百度 ...
- Python学习日记之忽略删除字符串空白
使用Python自带的函数strip可以剔除字符串开头.结尾.两端的空白 使用场景:用户输入验证 strip : 去除字符串两端的空白 rstrip : 去除字符串末尾(右端)的空白 lstrip : ...
- android中用Intent传数据,如果用传递的是一个类,就将类实现Parcelable接口
Parcelable,内存单位,跨进程使用,或者intent传递对象的时候使用.android中用Intent传数据,如果用传递的是一个对象,就将对象实现Parcelable接口,而不是将对象序列化. ...
- jboss项目设置域名
1.在jboss-web.xml中添加<virtual-host>www.ceshi.com</virtual-host> <jboss-web> <cont ...
- Verification Mind Games---how to think like a verifier像验证工程师一样思考
1. 有效的验证需要验证工程师使用不同于设计者的思维方式思考问题.具体来说,验证更加关心在严格遵循协议的基础上发现设计里面的bug,搜索corner cases,对设计的不一致要保持零容忍的态度. m ...
- spring用来干什么,解决的问题
// 1. 实体类 class User{ } //2. dao class UserDao{ .. 访问db } //3. service class UserService{ UserDao ...
- bazel和TensorFlow安装
bazel安装:https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu 安 ...
- Leetcode724:寻找数组的中心索引(java、python3)
寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相 ...
- 前端安全 xss
整体的 XSS 防范是非常复杂和繁琐的,不仅需要在全部需要转义的位置,对数据进行对应的转义.而且要防止多余和错误的转义,避免正常的用户输入出现乱码. 虽然很难通过技术手段完全避免 XSS,但可以总结以 ...