我遇到了以下问题:
现在你给出一个长度为n(n已知)为double sample[n]
的双倍数的给定数组,它是按升序排列的(所有元素都不同)。请编写一个带有一个参数double num
的函数,该函数返回sample[n]
中最接近参数num
的元素的索引。如果num
恰好位于一个间隔的中间,则返回元素的索引小于它。
这是我在Java中的代码:
public int getIndex(double num) {
if(sample[0] >= num) {return 0;}
for(int i = 1, i < sample.length; i++) {
if(sample[i] == num) {return i;}
else if(sample[i] > num) {
return (sample[i]-num) < (num-sample[i-1]) ? i : i-1;
else {continue;}
}
return sample.length;
}
显然是线性复杂性。但是,我的老师告诉我,存在O(log n)的算法。任何人都可以帮我编码吗?
答案 0 :(得分:1)
您的数组已排序,这意味着您可以使用binary search。我没有任何内容可以添加到这个答案中,也不会为您提供准备好的代码,因为这是您的责任。主要思想是检查数组的中间元素,然后确定应该移动的方向:数组的前半部分或后半部分等等。