在本文中,我们给出了一个整数数组和一个关键字。我们需要在数组中重复查找关键字,并在每次查找时将其加倍。我们需要返回在进行这个操作时数组中不存在的值。
查看一些输入场景以了解该方法在不同情况下的工作原理
让我们来看一个数组 [1,2,6,3,7,4,9],它的键是 1。
Input: {1, 2, 3, 4, 5, 6}, k = 1
Result: 8
登录后复制
如果我们找到 1,我们会将其加倍为 2。
如果我们找到2,我们会把它加倍变成4。
如果我们找到4,我们将其加倍为8。
我们返回 8,因为数组中没有元素 8
在另一种情况下,我们考虑一个数组 {2, 3, 7, 8, 5, 9},它的键是 1。
Input: {2, 3, 7, 8, 5, 9}, k = 1
Result: 1
登录后复制
我们按原样返回 1,因为输入数组中没有元素 1。
算法
-
对数组元素进行排序,因为对于小型数组来说,执行二分搜索的复杂度较低。
-
每当数组中的元素与键值匹配时,将键值加倍,并再次搜索数组以找到与新键匹配的元素。
-
重复此步骤,直到数组中没有与双倍键值匹配的元素为止。
-
最终的键值就是得到的输出。
示例(使用向量ADT)
我们通过对数组进行排序来开始实现此方法。之后,我们将完全按照问题所说的去做;搜索并加倍。我们通过二分搜索来进行优化搜索。让我们通过应用相同的逻辑来看看 C++ 程序 -
#include
#include
#include
using namespace std;
int solve(vector& arr, int key) {
sort(arr.begin(), arr.end());
bool found = binary_search(arr.begin(), arr.end(), key);
while(found) {
key*=2;
found = binary_search(arr.begin(), arr.end(), key);
}
return key;
}
int main() {
vector arr = {1,2,6,3,7,4,9};
int key = 1;
cout