今天听一个同学讲他们公司来了一个本科斯坦福研究生哈佛的面试都被刷了,原因是一道简单的智力题都打不出来,本着好奇的心情我们问她什么智力题–“有十二个球,其中有一个球与其它球重量不一样。要求用天平只称三次就要找出此球”。
今天我们不讲该题答案,网上一搜一大堆,我们讲讲他所用到的追溯思想–二分法:
题目
用二分法如何查找一个数
分析
思路很简单,拿中间的数和要找的数比较,前者小则数组范围重新定义到后半部分,前者大则数组范围重新定义到前半部分。
代码
#include <iostream>
using namespace std;
int bin_Search(int a[], int n, int val) {
int start = 0;
int end = n-1;
while (start <= end) {
int mid = start + ((end - start) >> 1);
if(val < a[mid]) {
end = mid - 1;
}
else if(val > a[mid]) {
start = mid + 1;
}
else {
return mid;
}
}
return -1;
}
int main(){
int a[] = {1,2,4,6,8,9,11};
int size = sizeof(a) / sizeof(int);
int findval = 3;
int idx = bin_Search(a, size, findval);
if(-1 != idx) {
cout << "find " << a[idx] << ", the idex is" << idx << endl;
}
else {
cout << "not find " << findval << endl;
}
}