สมมติว่าเรามีรายการจำนวนเต็มเฉพาะที่เรียกว่า 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