Repeatedly Search for an Element by Doubling it After Every Successful Search Using C++

In this article, we are given an array of integers and a key. We must find the key repeatedly in the array and double it on each find in the array. We need to return the value not present in the array doing this operation.

Some input scenarios to look at to understand how the method works in different cases

Let's have an array [1,2,6,3,7,4,9], and its key is 1.

Input: {1, 2, 3, 4, 5, 6}, k = 1
Result: 8

If we find 1 we double it to 2.

If we find 2 we double it to 4.

If we find 4 we double it to 8.

We return 8 as there is no element 8 in the array

In another case, let's consider an array {2, 3, 7, 8, 5, 9} and its key is 1.

Input: {2, 3, 7, 8, 5, 9}, k = 1
Result: 1

We return 1 as it is, since there is no element 1 in the input array.

Algorithm

  • Sort the elements of the array as performing a binary search takes lower complexity for small arrays.

  • Whenever the element in the array matches with the key value, double the key value and search the array again to find elements that match with the new key.

  • Repeat this step until there is no element in the array that matches with the doubled key value.

  • The final key value is the obtained output.

Example (Using Vector ADT)

We start implementing this method by sorting the array. After that, we will do exactly as the question says; search and double. We search by the binary search for optimization. Let us look at C++ program by applying the same logic ?

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><algorithm></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">solve</span><span class="token punctuation">(</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">&</span> arr<span class="token punctuation">,</span> <span class="token keyword">int</span> key<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token function">sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">bool</span> found <span class="token operator">=</span> <span class="token function">binary_search</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">while</span><span class="token punctuation">(</span>found<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      key<span class="token operator">*=</span><span class="token number">2</span><span class="token punctuation">;</span>
      found <span class="token operator">=</span> <span class="token function">binary_search</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">return</span> key<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> arr <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> key <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">solve</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> key<span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

8

Example (Without Using Vector ADT)

The C++ program also follows the same logic but without using the vector abstract data type.

We start implementing this method by sorting the array. After that, we will do exactly as the question says; search and double. We search by the binary search for optimization.

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">SearchElement</span><span class="token punctuation">(</span><span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">int</span> n<span class="token punctuation">,</span> <span class="token keyword">int</span> k<span class="token punctuation">)<font color="#000000"> </font></span><span class="token punctuation">{</span>

   <span class="token comment">// Sorting is done so binary searching in the element</span>
   <span class="token comment">// would be easier</span>
   <span class="token function">sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> arr <span class="token operator">+</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> max <span class="token operator">=</span> arr<span class="token punctuation">[</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Declaring the maximum element in the array</span>
   <span class="token keyword">while</span> <span class="token punctuation">(</span>k <span class="token operator"><</span> max<span class="token punctuation">)</span> <span class="token punctuation">{</span>

      <span class="token comment">// search for the element k in the array</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">binary_search</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> arr <span class="token operator">+</span> n<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">)</span>
         k <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span>
      <span class="token keyword">else</span>
      <span class="token keyword">return</span> k<span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">return</span> k<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)<font color="#000000"> </font></span><span class="token punctuation">{</span>
   <span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">7</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token function">SearchElement</span><span class="token punctuation">(</span>arr<span class="token punctuation">,</span> n<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

12

Conclusion

We have used the STL binary search method, which returns true or false based on whether the element is found or not. We could also have used our custom implementation of binary search. STL provides excellent methods of sorting and search, which helped us code the problem without overthinking the implementation.

Updated on: 2022-08-10T08:56:48+05:30

460 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements