标签:style blog color for div sp 代码 log c
题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
思路一:
1,先采用归并排序对这个数组排序,
2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true,
3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false。
论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x;
所以A[i]前面的数(不包括A[i])无论取哪两个数都不可能使和等于x,只能小于x
对位置k向前寻找时,当寻找到A[k]+A[i]=sum,返回true;当寻找到sum<x时,令k=i,跳出对k的循环,继续寻找
当所有的路径寻找完之后,返回false,没找到
代码如下:
1 public boolean ExitSumX(int A[],int x) 2 { 3 //归并排序 4 MessSort(A); 5 6 int k=0; 7 for(int i=1;i<A.length;i++) 8 { 9 if(i!=k) 10 { 11 if(A[k]+A[i]==x) 12 return true; 13 else if(A[k]+A[i]<x) 14 k=i; 15 else 16 { 17 while(k>0) 18 { 19 k--; 20 if(A[k]+A[i]==x) 21 return true; 22 else if(A[k]+A[i]<x) 23 { k=i;break; };
24 } 25 } 26 } 27 } 28 return false; 29 }
算法分析:归并排序时间为:O(nlgn),寻找算法时间复杂度为O(n2),算法整体时间复杂度为:O(n2),可见算法不算太好
思路二:
这种算法时间复杂度为O(nlgn),思路来自 算法导论
给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
标签:style blog color for div sp 代码 log c
原文地址:http://www.cnblogs.com/justinjia/p/3980173.html