สมมติว่าเรามีการอ้างอิงจำนวนหนึ่ง (การอ้างอิงเป็นจำนวนเต็มที่ไม่เป็นลบ) ของผู้วิจัย ตัวเลขเหล่านี้เรียงตามลำดับที่ไม่ลดลง เราต้องกำหนดฟังก์ชันเพื่อคำนวณดัชนี h ของผู้วิจัย ตามคำจำกัดความของดัชนี h:"นักวิทยาศาสตร์มีดัชนี h ถ้า h ของเอกสาร N ของเขา/เธอ มีการอ้างอิงอย่างน้อย h รายการแต่ละรายการ และเอกสาร N - h อื่น ๆ มีการอ้างอิงไม่เกิน h รายการแต่ละรายการ"
ดังนั้นหากอินพุตเป็นเหมือนการอ้างอิง =[0,1,4,5,6] ผลลัพธ์จะเป็น 3 ตามที่ระบุว่าผู้วิจัยมีห้าเอกสาร เขาได้ 0, 1, 4, 5, 6 รายการ ตามลำดับ เนื่องจากผู้วิจัยมีเอกสาร 3 ฉบับ แต่ละรายการมีการอ้างอิงอย่างน้อย 4 รายการ และกระดาษอีก 2 รายการที่เหลือมีการอ้างอิงไม่เกิน 4 รายการแต่ละรายการ ดัชนี h จึงเท่ากับ 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ans :=0, ต่ำ :=0, n :=ขนาดของอาร์เรย์ สูง :=n – 1
-
ถ้าขนาดของอาร์เรย์ =0 ให้คืนค่า 0
-
ในขณะที่ต่ำ <=สูง −
-
กลาง :=ต่ำ + (สูง - ต่ำ)/2
-
ถ้า A[กลาง] =ขนาดของอาร์เรย์ – กลาง ให้คืนค่า A[กลาง]
-
มิฉะนั้น เมื่อ A[กลาง]> n – กลาง แล้วสูง :=กลาง – 1
-
มิฉะนั้นต่ำ :=กลาง + 1
-
-
ผลตอบแทน n – สูง – 1
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int hIndex(vector<int>& A) { int ans = 0; int low = 0; int n = A.size(); int high = n - 1; if(A.size() == 0) return 0; while(low <= high){ int mid = low + (high - low) / 2; if(A[mid] == A.size() - mid){ return A[mid]; } else if(A[mid] > (n - mid)){ high = mid - 1; } else low = mid + 1; } return n - (high + 1); } }; main(){ Solution ob; vector<int> v = {0,1,4,5,7}; cout << (ob.hIndex(v)); }
อินพุต
[0,1,4,5,6]
ผลลัพธ์
3