数组中求俩个数,三个数,K个数和为给定sum

来源:互联网 发布:网络赚钱的门路和技巧 编辑:程序博客网 时间:2024/06/06 19:30

给定一个数组,一个数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));    }}
阅读全文
1 0
原创粉丝点击