Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาโดยบังเอิญใน C++


สมมติว่าเรามีรายการจำนวนเต็มเฉพาะที่เรียกว่า nums เราต้องหาจำนวนเต็มที่ยังหาได้สำเร็จโดยใช้การค้นหาไบนารีมาตรฐาน

ดังนั้น หากอินพุตเป็น [2,6,4,3,10] ผลลัพธ์จะเป็น 3 ราวกับว่าเราใช้การค้นหาแบบไบนารีเพื่อค้นหา 4 เราจะหามันได้ในตอนแรก การวนซ้ำ นอกจากนี้เรายังสามารถหา 2 และ 10 หลังจากการวนซ้ำสองครั้งได้

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน help() ซึ่งจะใช้เป้าหมาย อาร์เรย์ &nums

  • ต่ำ :=0

  • สูง :=ขนาดของตัวเลข - 1

  • ในขณะที่ต่ำ <=สูง ทำ -

    • กลาง :=ต่ำ + (สูง - ต่ำ) / 2

    • ถ้า nums[mid] เท่ากับเป้าหมายแล้ว −

      • คืนความจริง

    • ถ้า nums[กลาง] <เป้าหมาย แล้ว −

      • ต่ำ :=กลาง + 1

    • มิฉะนั้น

      • สูง :=กลาง - 1

  • คืนค่าเท็จ

  • จากวิธีหลัก ให้ทำดังนี้ −

  • ยกเลิก :=0

  • สำหรับแต่ละองค์ประกอบ i เป็น nums

    • ret :=ret + help(i, nums)

  • รีเทิร์น

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool help(int target, vector<int> & nums) {
      int low = 0;
      int high = nums.size() - 1;
      while (low <= high) {
         int mid = low + (high - low) / 2;
         if (nums[mid] == target)
         return true;
         if (nums[mid] < target) {
            low = mid + 1;
         } else {
            high = mid - 1;
         }
      }
      return false;
   }
   int solve(vector<int> & nums) {
      int ret = 0;
      for (int i : nums) {
         ret += help(i, nums);
      }
      return ret;
   }
};
main() {
   Solution ob;
   vector<int> v = {2,6,4,3,10};
   cout << (ob.solve(v));
}

อินพุต

{2,6,4,3,10}

ผลลัพธ์

3