您的位置:首页 > 编程语言 > Java开发

(java)求3sum和4sum

2016-04-18 22:11 302 查看
求3sum的思路是:

    固定一个数,然后从其余的数中,选择两个数之和为target-nums[i]的两个数。

求4sum的思路是:

  固定两端的两个数,然后在中间找两个数的和是target-(nums[i]+nums[j]) 的两个数。

当然 去重是最麻烦的,我这里的思路是这样,如下代码所示:上为3sum下为4sum:

public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> re=new ArrayList<List<Integer>>();
if(nums.length<3){
return re;
}
Arrays.sort(nums);
boolean first=true;
int temp=nums[0];
for(int i=0;i<nums.length-2;i++){
if(first){
temp=nums[0];
first=false;
}else{
if(temp==nums[i]){
continue;
}
}
find(re,nums,i+1,nums.length-1,0-nums[i]);
temp=nums[i];
}
return re;
}
public static void find(List<List<Integer>> re,int[] nums,int begin,int end,int target){
while(begin<end){
if(nums[begin]+nums[end]==target){
List<Integer> l=new ArrayList<Integer>();
l.add(0-target);l.add(nums[begin]);l.add(nums[end]);
re.add(l);
int tempbegin=nums[begin];
while(begin<end && nums[begin]==tempbegin){
begin++;
}
int tempend=nums[end];
while(begin<end && nums[end]==tempend){
end--;
}
}else if(nums[begin]+nums[end]<target){
int tempbegin=nums[begin];
while(begin<end && nums[begin]==tempbegin){
begin++;
}
}else{
int tempend=nums[end];
while(begin<end && nums[end]==tempend){
end--;
}
}
}
<span style="white-space:pre">	</span>}

public static List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> re=new ArrayList<List<Integer>>();
if(nums.length<4){
return re;
}
Arrays.sort(nums);
boolean first1=true;
int temp1=0;
for(int i=0;i<nums.length-3;i++){
if(first1){
temp1=nums[i];
first1=false;
}else{
if(nums[i]==temp1)
continue;
}
temp1=nums[i];
boolean first2=true;
int temp2=0;
for(int j=nums.length-1;j>i+2;j--){
if(first2){
temp2=nums[j];
first2=false;
}else{
if(nums[j]==temp2)
continue;
}
temp2=nums[j];
int sum=nums[i]+nums[j];
int begin=i+1;
int end=j-1;
while(begin<end){
int t=nums[begin]+nums[end];
if(t==(target-sum)){
List<Integer> l=new ArrayList<Integer>();
l.add(nums[i]);
l.add(nums[begin]);
l.add(nums[end]);
l.add(nums[j]);
re.add(l);
int tempbegin=nums[begin];
while(begin<end && nums[begin]==tempbegin){
begin++;
}
int tempend=nums[end];
while(begin<end && nums[end]==tempend){
end--;
}
}else if(t<(target-sum)){
int tempbegin=nums[begin];
while(begin<end && nums[begin]==tempbegin){
begin++;
}
}else{
int tempend=nums[end];
while(begin<end && nums[end]==tempend){
end--;
}
}
}
}
}
return re;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法 编程