给定一个数组,一个数sum,在数组中快速找到俩个数和为sum。
给定一个数组,一个数sum,在数组中快速找到三个数和为sum。
给定一个数组,一个数sum,求数组中可以找到多少种组合使得和为sum。不限制组合里面数的个数。
package com.liu.common;
/**
* Created by kaizige on 2017/8/5.
*/
import java.util.*;
public class Main{
public int[]a;
public int n;
public int sum;//和
public int[]dp;//动态规划数组,求K个数和为sum时使用
public int total;//保存数目对的结果
public int[] two=new int[2];//求俩个数和为sum时使用
public int[] three =new int[3];//求三个数和为sum时使用
public void read(){
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
sum=scanner.nextInt();
a=new int[n];
dp=new int[sum+1];
for(int i=0;i<n;i++){
a[i]=scanner.nextInt();
}
}
//求数组中和为sum的任意k个数的组合有多少种
public void kSum(){
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=sum;j>=a[i];j--){
dp[j]=dp[j]+dp[j-a[i]];
}
}
total=dp[sum];
}
//在数组中快速找到俩个数和为给定sum,找到一组就停止。求之前要求先对数组排序
public void twoSum(){
int i=0;
int j=n-1;
while(i<j){
if(a[i]+a[j]==sum){
two[0]=a[i];
two[1]=a[j];
break;
}
if(a[i]+a[j]<sum){
i++;
}else{
j--;
}
}
}
//在数组中快速找到三个数和为给定sum,找到一组就停止。求之前要求先对数组排序
public void threeSum(){
for(int i=0;i<n;i++){
int temp=a[i];
swap(i,0);//交换数组中下标为i和0的俩个数
int start=1;
int end=n-1;
while(start<end){
if(a[start]+a[end]==sum-temp){
three[0]=temp;
three[1]=a[start];
three[2]=a[end];
return ;
}else if(a[start]+a[end]>sum-temp){
end--;
}else {
start++;
}
}
swap(i,0);
}
}
private void swap(int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void main(String[] args) {
//俩个数和测试
// Main main=new Main();
// main.read();
// Arrays.sort(main.a);
// main.twoSum();
// System.out.println(Arrays.toString(main.two));
//k个数和测试
// Main main=new Main();
// main.read();
// main.kSum();
// System.out.println(main.total);
//三个数和测试
Main main=new Main();
main.read();
Arrays.sort(main.a);
main.threeSum();
System.out.println(Arrays.toString(main.three));
}
}