一个无序数组,任意两个数相加等于一个给定的数,并且用复杂度最小的方法得出
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。