A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© t_mac 黑马帝   /  2011-12-11 22:44  /  2081 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

数组int[] arr={3,5,2,4,1,8},要求从arr中找出所有“和”等于10的子集。

除了简单的循环遍历外,大家有什么高效的方法吗?

4 个回复

倒序浏览
本帖最后由 benbenqi 于 2011-12-12 08:03 编辑

先排序,然后再查找,如果大于了 下面的就不用加了,
继续找第二个往下加。。
要断电了
没法写代码了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
wsssx 2011-12-12 11:27:40
藤椅
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
本帖最后由 程传鹏 于 2011-12-12 11:58 编辑

数组int[] arr={3,5,2,4,1,8},要求从arr中找出所有“和”等于10的子集。

除了简单的循环遍历外,大家有什么高效的方法吗?
  当仅为求两个数的和时,如下分析
  解答
  1.另外设个布尔数组,arrb,arrb表示为数值为i的数值是否存在,如arrb[3]为true,arrb[9]为false
  2.通过arr数组确定arrb数组的真假值
  3.循环,判断所要求的和即10-arr[j]=x的结果在arrb数组中是真还是假,即判断arrb[x],若是真,输出这两个数,并把arrb[x]改成false,否,循环判断下一个数值x
  该方法的优点:只进行一次循环即可得到结果
  但当求若干个数的和的时候,怎么办?
  优化:
   我们直接优化第三步:
  3.循环,判断所要求的和即10-arr[j]=x的结果在arrb数组中是真还是假,即判断arrb[x],若是真,输出这两个数,并把arrb[x]改成false,否,则循环减后的这个数,若这个数可以被剩下的数相加得到,则表示10可以由x和arr[j]相加得到,虽然x数组中不存在,但是x可以由剩下的数相加得到,到此,就把问题变成了 判断10=判断x+arr[j];用递归或递推方法都可以实现.

评分

参与人数 1技术分 +1 收起 理由
admin + 1 字体可以编辑的!

查看全部评分

回复 使用道具 举报
不知道为什么,字体成这样了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马