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

ค้นหาในอาร์เรย์ที่เรียงลำดับของขนาดที่ไม่รู้จักใน C++


สมมติว่าเรามีอาร์เรย์และเรียงลำดับจากน้อยไปมาก เราต้องกำหนดฟังก์ชันเพื่อค้นหาเป้าหมายเป็น nums หากเป้าหมายมีอยู่ ให้ส่งคืนดัชนี มิฉะนั้น ให้คืนค่า -1

ไม่ทราบขนาดอาร์เรย์ เราสามารถเข้าถึงอาร์เรย์ได้โดยใช้อินเทอร์เฟซ ArrayReader เท่านั้น มีฟังก์ชัน get เช่น ArrayReader.get(k) ซึ่งจะคืนค่าองค์ประกอบของอาร์เรย์ที่ดัชนี k

ดังนั้น หากอินพุตเป็นเหมือน array =[-1,0,3,5,9,12], target =9 ผลลัพธ์จะเป็น 4 เนื่องจากมี 9 อยู่ใน nums และดัชนีของมันคือ 4

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

  • สูง :=1 ต่ำ :=0

  • ในขณะที่ได้รับ (สูง) ของผู้อ่าน <เป้าหมาย ทำ -

    • ต่ำ :=สูง

    • สูง =สูง * 2

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

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

    • x :=รับ (กลาง) ของผู้อ่าน

    • ถ้า x เท่ากับเป้าหมาย −

      • คืนกลาง

    • ถ้า x> เป้าหมาย แล้ว −

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

    • มิฉะนั้น

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

  • กลับ -1

ตัวอย่าง

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

#include <bits/stdc++.h>
using namespace std;
class ArrayReader{
private:
   vector<int> v;
public:
   ArrayReader(vector<int> &v){
      this->v = v;
   }
   int get(int i){
      return v[i];
   }
};
class Solution {
public:
   int search(ArrayReader& reader, int target) {
      int high = 1;
      int low = 0;
      while (reader.get(high) < target) {
         low = high;
         high <<= 1;
      }
      while (low <= high) {
         int mid = low + (high - low) / 2;
         int x = reader.get(mid);
         if (x == target)
            return mid;
         if (x > target) {
            high = mid - 1;
         }
         else
            low = mid + 1;
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<int> v = {-1,0,3,5,9,12};
   ArrayReader reader(v);
   cout<<(ob.search(reader, 9));
}

อินพุต

{-1,0,3,5,9,12}, 9

ผลลัพธ์

4