前情提要
這篇文章是關於 Virtual Judge
刷題的紀錄,主要記錄了解題的過程和心得。在 08/21 的刷題中,挑選了 P2249
這道題目,並使用了經典的 二分搜尋法 (Binary Search)
來解題。文章會分享解題的邏輯、程式碼,以及一些關於該題的細節,幫助讀者了解如何高效地透過二分搜尋法解決問題。
題目要求我們在一個排序的數列中,尋找某些目標數字的首次出現位置。為了達到高效搜尋,程式利用二分搜尋法縮小範圍,並在找到匹配的數字時,記錄它的索引位置。接下來將分享這段程式碼的完整實現與運作流程!
- P2249
題目連結
- 這題解題思路主要是使用二分搜尋法來解決問題。透過不斷縮小範圍來尋找目標數字的位置,當找到相同的數字時,即可將其所在的中間位置輸出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <bits/stdc++.h>
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr);
long long n,m; cin >> n >> m;
vector<int> a(n); for(auto i =0; i < n;++i){ cin >> a[i]; }
bool first = true;
while(m--){ int q,left=0,right=n-1; int ans = -1; cin >> q;
while(left <= right){ int mid = left + (right - left) / 2 ; if (a[mid] >= q){ if(a[mid] == q){ ans = mid + 1; } right = mid - 1; } else { left = mid + 1; } } if(!first) cout << " "; cout << ans; first = false; } cout << "\n"; }
|