(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--;
}
}
}
固定一个数,然后从其余的数中,选择两个数之和为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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树