有一堆数,怎么在这堆数种找出几个数使他们的和为N
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有一堆数,怎么在这堆数种找出几个数使他们的和为N相关的知识,希望对你有一定的参考价值。
假设数组是1,3,2,6,4,5 怎么找出其中的几个数使他们的和为7.。
能找出来输出YES。。不能输出NO。。
求算法,最好带着代码。。
求高效的算法。。 在ACM中 一楼的肯定会超时的。如果有N个数,两个的得算(n-1)*n/2遍。。三个的(n-1)*(n-2)/2…如果N很大 计算量是很大的。。听一些人说可以用背包做,但是不知道怎么用。。
int main( )
int a[]=1,3,2,6,4,5;
int flag=0,i,j,k,r,s;
for(i=0;i<6;i++)
for(j=i+1;j<6;j++)
if((a[i]+a[j])==7)
printf("Yes!2个数:%d+%d\n",a[i],a[j]);
flag=1;
for(k=j+1;k<6;k++)
if((a[i]+a[j]+a[k])==7)
printf("Yes!3个数:%d+%d+%d\n",a[i],a[j],a[k]);
flag=1;
for(r=k+1;r<6;r++)
if((a[i]+a[j]+a[k]+a[r])==7)
printf("Yes!4个数:%d+%d+%d+%d\n",a[i],a[j],a[k],a[r]);
flag=1;
for(s=r+1;s<6;s++)
if((a[i]+a[j]+a[k]+a[r]+a[s])==7)
printf("Yes!5个数:%d+%d+%d+%d+%d\n",a[i],a[j],a[k],a[r],a[s]);
flag=1;
if(flag==0)
printf("NO!\n");
return 0;
大致就是2个相加,3个相加,一直到5个相加判断和是否为7,做的比较简单。 参考技术B 应该先排序,后计算吧!
找出一堆数中最小的前K个数
描写叙述:
给定一个整数数组。让你从该数组中找出最小的K个数
思路:
最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以。
可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然有点浪费。比方让求10000个整数数组中的最小的10个数。用排序的话平均时间复杂度差为Nlog(N)。
于是想到了,用堆来实现,可是自己实现又太麻烦。想到了java里面的TreeSet,先将K个数放入TreeSet中。因为TreeSet会对里面的元素进行排序。所以在TreeSet中的元素是有序的。以后没插入一个元素,将TreeSet中的最大元素删除就可以,所以TreeSet动态维持K个元素且这K个元素是有序的。
代码:
import java.util.TreeSet; public class FirstKElements { public static TreeSet<Integer>getFirstKElements(int arr[],int k) { TreeSet<Integer>set=new TreeSet<Integer>(); int len=arr.length; k=k%len; int i=0; int num=0; for(i=0;i<k;i++) set.add(arr[i]); for(i=k;i<len;i++) { set.add(arr[i]); num=set.last(); set.remove(num); } return set; } public static void main(String[] args) { // TODO Auto-generated method stub int arr[]={9,7,5,4,2,1,3,6,8}; System.out.println(FirstKElements.getFirstKElements(arr, 4)); } }结果:
以上是关于有一堆数,怎么在这堆数种找出几个数使他们的和为N的主要内容,如果未能解决你的问题,请参考以下文章