题目:
(18题)输入一个数组,和一个数k,在屏幕上打印数组内所有和为k的三个数的组合
思路:
这题我出的,想多了。纯属想多了。我都想到做哈希表把所有两个数的结果排列进去的方法来实现n2级的查找,然后发现其实只要首尾两个指针就可以了……
方案:
对数组依次遍历,针对每个当前数array[i],寻找在它前面的数组中和为k-array[i]的组合。保证了数字的排位次序,也就能保证不会重复输出同一组合
代码:
1 void FindThreeNumbers(int *array,int len,int k) 2 { 3 //思路:从第三个数遍历到结尾,对每个数array[i],寻找它前面的序列内是否有一个两个数的组合和为k-array[i] 4 int i; 5 int begin,end; 6 for(i=2;i<=len-1;++i) 7 { 8 begin=0; 9 end=i-1; 10 while(begin<end) 11 { 12 13 if(array[begin]+array[end]<k-array[i]) 14 ++begin; 15 else if(array[begin]+array[end]>k-array[i]) 16 --end; 17 else 18 { 19 printf("Find: %d %d %d\n",array[begin],array[end],array[i]); 20 ++begin; 21 --end; 22 } 23 } 24 } 25 }