一个无序数组,任意两个数相加等于一个给定的数,并且用复杂度最小的方法得出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个无序数组,任意两个数相加等于一个给定的数,并且用复杂度最小的方法得出相关的知识,希望对你有一定的参考价值。

1. 最简单的方法就是穷举,这种虽然简单,但是非常不划算,时间复杂度达到O(N^2)
2. 可以换一个角度考虑,给定的数如果是M,那么针对数组中一个数字N,我们只需要查找一下数
组中是否含有M-N就可以了,这样就转换为数组查找问题了,然后可以利用空间换时间来搞
定,搞一个hash表,然后把每一个都映射到hash表中去,然后查找的时候就需要O(1)就可以
了,只不过空间复杂度达到O(N)
3. 可以先排序一下,使用快排,时间复杂度为O(NlogN),然后令i = 0, j = n - 1,计算sum = arr[i]
+ arr[j],如果sum大于M就让j = j - 1,否则让i = i + 1,这样一轮下来就可以了,时间复杂度
O(N),总的时间复杂度为O(NlogN)
参考技术A

返回 false 或 true

参考技术B 循环

Java 集合数组 任意个数数字相加等于一个指定的数

一组数字 任意个数数字相加的和等于指定的数字。  比如数字集合 1,2,3, 4,5,6  ,列出所有数字相加等于6的可能性,那么结果有:1+2+3,2+4, 主要这里的结果不是数组打乱顺序相加,而是按照数组顺序取任意个数相加减,所有大家看到结果只有1+2+3而没有1+3+2或则3+2+1

 

step1、实体类:

static class TestDTO  {
     String id; //id
    Integer num;//数字
     public String getId() {
        return id;
     }
    public void setId(String id) {
        this.id = id;
    }
    public Integer getNum() {
        return num;
    }
 
    public void setNum(Integer num) {
        this.num = num;
    }

}

 

step2、实现方法:

public  static List<List<TestDTO>>  Test(List<TestDTO> dtoParam,Integer samplesNumber) {
    List<List<TestDTO>>  reust = new ArrayList<List<TestDTO>>();
    int a=1;
    int c=1;
    List<TestDTO> d=null;
    for (int i = 0; i < dtoParam.size(); i++) {
        int s =  dtoParam.get(i).getNum();
       StringBuffer   str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
        boolean bb=true;
        while(bb){
            if(bb=false){
                break;
            }
            if(dtoParam.size()==a){
                bb=false;
                break;
            }
            boolean b=true;
            while(b){
                if(dtoParam.size()==c){
                    a++;
                    b=false;
                    c=a;
                    break;
                }
                d = new ArrayList<TestDTO>();
                d.add(dtoParam.get(i));
                for(int j=c;j<dtoParam.size();j++){
                    s = s + dtoParam.get(j).getNum();
                    d.add(dtoParam.get(j));
                     str.append(dtoParam.get(j).getNum()+"+");//用于控制台打印显示,和逻辑无关
                    System.out.println(str.substring(0,str.length()-1));//用于控制台打印显示,和逻辑无关
                    if (s == samplesNumber) {
                        reust.add(d);
                        break;
                    }
                    if(dtoParam.size()-j==1){
                        s =  dtoParam.get(i).getNum();
                        str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
                        c++;
                        break;
                    }
                }
            }
        }
    }
    return  reust;
}

 

step3、测试方法:

 

 public static void main(String[] args) {
 //模拟一个数字集合
   //模拟一个数字集合
        List<TestDTO> l=new ArrayList<TestDTO>();
        for(int i=1;i<10;i++){
            TestDTO d=new TestDTO();
            d.setId(i+"");
            d.setNum(i);
            l.add(d);
        }
        List<List<TestDTO>>  list=   Test(l,6);
        for (int i=0;i<list.size();i++){
            String str="";
            for(int j=0;j<list.get(i).size();j++){
                str=str+list.get(i).get(j).getNum()+"+";
            }
            System.out.println("第"+i+"个结果:"+str.substring(0,str.length()-1));
        }

}

 

step4、输出结果:

控制台输出所有数字相加的情况
 
1+2
1+2+3
1+2+3+2
1+2+3+2+3
1+2+3+2+3+4
1+2+3+2+3+4+5
1+2+3+2+3+4+5+6
1+2+3+2+3+4+5+6+7
1+2+3+2+3+4+5+6+7+8
1+2+3+2+3+4+5+6+7+8+9
1+3
1+3+4
1+3+4+5
1+3+4+5+6
1+3+4+5+6+7
1+3+4+5+6+7+8
1+3+4+5+6+7+8+9
1+4
1+4+5
1+4+5+6
1+4+5+6+7
1+4+5+6+7+8
1+4+5+6+7+8+9
1+5
1+5+5
1+5+5+6
1+5+5+6+7
1+5+5+6+7+8
1+5+5+6+7+8+9
1+6
1+6+7
1+6+7+8
1+6+7+8+9
1+7
1+7+8
1+7+8+9
1+8
1+8+9
1+9
2+3
2+3+4
2+3+4+5
2+3+4+5+6
2+3+4+5+6+7
2+3+4+5+6+7+8
2+3+4+5+6+7+8+9
2+4
2+4+4
2+4+4+5
2+4+4+5+6
2+4+4+5+6+7
2+4+4+5+6+7+8
2+4+4+5+6+7+8+9
2+5
2+5+6
2+5+6+7
2+5+6+7+8
2+5+6+7+8+9
2+6
2+6+7
2+6+7+8
2+6+7+8+9
2+7
2+7+8
2+7+8+9
2+8
2+8+9
2+9
3+4
3+4+5
3+4+5+6
3+4+5+6+7
3+4+5+6+7+8
3+4+5+6+7+8+9
3+5
3+5+6
3+5+6+7
3+5+6+7+8
3+5+6+7+8+9
3+6
3+6+7
3+6+7+8
3+6+7+8+9
3+7
3+7+8
3+7+8+9
3+8
3+8+9
3+9
4+5
4+5+6
4+5+6+7
4+5+6+7+8
4+5+6+7+8+9
4+6
4+6+7
4+6+7+8
4+6+7+8+9
4+7
4+7+8
4+7+8+9
4+8
4+8+9
4+9
5+6
5+6+7
5+6+7+8
5+6+7+8+9
5+7
5+7+8
5+7+8+9
5+8
5+8+9
5+9
6+7
6+7+8
6+7+8+9
6+8
6+8+9
6+9
7+8
7+8+9
7+9
8+9
 
 
最后筛选结果:
第0个结果:1+2+3=6
第1个结果:1+5=6
第2个结果:2+4=6

 

以上是关于一个无序数组,任意两个数相加等于一个给定的数,并且用复杂度最小的方法得出的主要内容,如果未能解决你的问题,请参考以下文章

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

Java 集合数组 任意个数数字相加等于一个指定的数

刷了两道题

给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

未排序数组中累加和小于或等于给定值的最长子数组长度

求一个数组的数字有几种组合方式,6个数相加等于100.用PHP写的程式