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