题:
您会得到一个数组和一个键。您需要返回该元素的Ceil。
什么是Ceil?
如果给您一个数字,请说“5.8”,该数字的下限是5,ceil是6。
这个问题中的Ceil是什么?
数组= {1,2,3,4,6,7,8,9};
键= 5;
在上面的数组中,元素5不存在。但是我们需要找到5的Ceil。5的下限是6。
因此我们可以定义Ceil是大于给定键的最小元素。
因此,根据以上定义,大于5的最小元素为6。
我们可以通过二进制搜索解决这个问题。
当我们得到中间元素时,我们检查中间元素是否等于键。如果相等,则返回。
否则,我们需要向右或向左移动一半。
当移动数组的左侧时,我们将元素保存在该索引处,然后移动到左侧的一半。
否则,我们直接移到右半部分。
C ++解决方案
#include <iostream> using namespace std; int ceil = -1; int get_floor(int arr[], int length, int key) { int start = 0; int end = length - 1; while (start <= end) { int mid = (start + end) / 2; if (arr[mid] == key) return arr[mid]; // return mid-1 if arr[mid - 1] is equal to key else if (key < arr[mid]) { ceil = arr[mid]; end = mid - 1; } else { start = mid + 1; } } return ceil; } int main(void) { int arr[] = {1, 2, 3, 4, 6, 7, 8, 9}; int size = sizeof(arr) / sizeof(arr[0]); int key = 5; int result = get_floor(arr, size, key); cout<<" The floor of "<< key <<" is " <<result<<endl; return 0; }
输出:
The floor of 5 is 6