快速找出一个数组中的两个数,让这两个数字之和定于一个给定的值(编程之美2.12)
2012-09-27 22:10
246 查看
问题:快速找出一个数组中的两个数,让这两个数字之和定于一个给定的值
解法一:用两层循环,时间复杂度为O(N*N),不可取。代码如下:#include<stdio.h> #include<iostream.h> int a[100]; int main() { int n,sum; cout << "给定和值:"; cin >> sum; cout << "数组中个数:"; cin >> n; for(int b=0;b<n;++b) cin >> a; for(int i=0;i<n;++i) { for(int j=i+1;j<n;++j) if(a[i]+a[j]==sum) cout << a[i] << "+" << a[j] << "=" << sum << endl; } return 0; }
[b]解法二:先用快速排序,然后从两端向中间找,时间复杂度为O(Nlog2N)。代码如下:
int Partion(int* arr, int p, int r) { int temp; int i = p; int j = r; temp = arr[i]; do { while(arr[j] >= temp && i < j) { j--; } if (i < j) { arr[i++] = arr[j]; } while(arr[i] < temp && i < j) { i++; } if (i < j) { arr[j--] = arr[i]; } } while (i != j); arr[i] = temp; return i; } void QuitSort(int*arr, int beg, int end)//快排函数 { if (beg < end) { int pn = Partion(arr, beg, end); QuitSort(arr, beg, pn - 1); QuitSort(arr, pn + 1, end); } } void FindTwoData(int* arr, int size, int num) { QuitSort(arr, 0, size - 1);//先用快速排序 for (int i = 0, j = size - 1; i < j;) { if (arr[i] + arr[j] == num) { cout<<arr[i]<<"+"<<arr[j]<<"="<<num<<endl; i++;//这里假设(2,8),2要求的结果是10,每个数只能用一次,不能重复使用,(2,8)用了,就不能再用(8,2) j--; } else if (arr[i] + arr[j] < num) { i++; } else { j--; } } }
解法三:用hash表,时间复杂度为O(N)也是最快的方法,但是牺牲了空间
代码如下:
void FindTwoData_Hash(int* arr, int size, int num) { int *HashArry = new int[num];//申请的空间为满足条件的两个数的和的大小,实在设计不出大小为size的哈希函数 memset(HashArry, 0, sizeof(int)*num); for (int i = 0; i < size; i++) { if (arr[i] <= num)//这里只考虑比num小的数 { if (arr[i] + HashArry[num - arr[i]] == num) { cout<<arr[i]<<"+"<<HashArry[num - arr[i]]<<"="<<num<<endl; HashArry[arr[i]] = arr[i]; } else { HashArry[arr[i]] = arr[i]; } } } delete[] HashArry; }
相关文章推荐
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,其和等于给定值。
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,使两个数之和 等于一个已给定的值
- 程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)
- 一个数组只有两个数字出现一次,其他数字都出现两次,找出这两个数
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 一个数组中两个数的和为N,找出这两个数字的下标
- 2.12 找出数组中和为给定的值的两个数字
- 算法题:从数组找数字(网易2017校园招聘) 2017-10-10 算法爱好者 (点击上方公众号,可快速关注) 给定一个数组,除了一个数出现 1 次之外,其余数都出现 3 次。找出出现一次的数。
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 给定一个数组和一个数字,给定的数组里是否存在两个数字之和等于给定的数字
- .一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 一个整型数组里除了两个数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 查找算法之查找一个数组中两两数字相同,只有其中两个数字是不一样的,将其找出