谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
2017-01-13 13:28
1986 查看
谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
分析:
分析:
“假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素。 那么可以把这些和看成N个有序数列: A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <=… A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <=… … A +B[1] <= A +B[2] <= A +B[3] <=… 问题转变成,在这N^2个有序数列里,找到前k小的元素”
//得到首中尾3个数的中位数 int getMidian(int array[], int low, int high) { int mid = low + ((high - low) >> 1); if (array[mid] > array[high]) { swap(array[mid], array[high]); } if (array[low] > array[high]) { swap(array[low], array[high]); } if (array[low] < array[mid]) { swap(array[mid], array[low]); } return array[low]; } int kth_elem(int array[], int low, int high, int th) { int pivot = getMidian(array, low, high); int lowTmp = low; int highTmp = high; while (lowTmp < highTmp) { while (lowTmp < highTmp && array[highTmp] > pivot) { highTmp--; } array[lowTmp] = array[highTmp]; while (lowTmp < highTmp && array[lowTmp] < pivot) { lowTmp++; } array[highTmp] = array[lowTmp]; } array[lowTmp] = pivot; if (th - 1 == lowTmp) { return array[lowTmp]; } else if (th - 1 < lowTmp) { return kth_elem(array, low, lowTmp - 1, th); } else { return kth_elem(array, lowTmp + 1, high, th); } }
相关文章推荐
- 求职中的感想
- 前端面试大全(问题+答案)2
- 面试被问Weex ,初步了解Weex,你看我就够了。
- 前端面试大全(问题+答案)1
- Android程序员学PHP开发(8)-常量预定义常量运算符号-PhpStorm
- 国外程序员整理机器学习资源大全
- Java程序员应该知道的10个调试技巧
- Java程序员的推荐阅读书籍
- 为什么开源可以提高程序员的编程技能?
- 诚心奉上的年后找工作的android猿们的10个面试题和解答
- 记录当时从程序员转行做业务
- Java程序员应该知道的10个调试技巧
- 核心思想:自由职业的所谓自由,必须先职业,然后才能自由(还要对抗自己的惰性,提前寻找客户)good
- 我赢职场告诉你为什么凤姐会逆袭成励志姐?
- Android 高级面试题及答案
- 面试笔试题
- 而立之年——三线城市程序员的年终告白
- 码农成长记——jqurey之同胞关系
- 嵌入式学习资源汇总及面试题
- foruok安晓辉的《程序员,你好哇》,都很不错