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

องค์ประกอบครอบคลุมช่วงที่เล็กที่สุดจากรายการ K ใน C++


สมมติว่าเรามีรายการของจำนวนเต็มที่เรียงลำดับแล้ว k รายการ เราต้องค้นหาช่วงที่เล็กที่สุดที่มีอย่างน้อยหนึ่งหมายเลขจากแต่ละรายการ k ที่นี่ช่วง [a,b] มีขนาดเล็กกว่าช่วง [c,d] เมื่อ b-a

ดังนั้นหากอินพุตเป็น [[4,10,15,25,26],[0,9,14,20],[5,18,24,30]] ผลลัพธ์จะเป็น [14, 18]

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

  • minRange :=inf, maxRange :=-inf, rangeSize :=inf, tempMinRange :=inf, tempMaxRange :=-inf
  • n :=ขนาดของ nums
  • กำหนดพอยน์เตอร์อาร์เรย์ที่มีขนาด n
  • กำหนดลำดับความสำคัญของคิว pq
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • แทรก { nums[i, 0], i } ลงใน pq
  • tempMaxRange :=สูงสุดของ tempMaxRange และ nums[i, 0]
  • ในขณะที่ 1 ไม่ใช่ศูนย์ ให้ทำ −
    • กำหนดอุณหภูมิหนึ่งคู่ :=ด้านบนของ pq
    • ลบองค์ประกอบออกจาก pq
    • tempMinRange :=temp.first
    • idx :=องค์ประกอบที่สองของอุณหภูมิ
    • ถ้า tempMaxRange − tempMinRange
    • rangeSize :=tempMaxRange - tempMinRange
    • minRange :=tempMinRange
    • maxRange :=tempMaxRange
  • (เพิ่มตัวชี้[idx] โดย 1)
  • ถ้าพอยน์เตอร์[idx] เท่ากับขนาดของ nums[idx] แล้ว −
    • ออกมาจากวงจร
  • มิฉะนั้น
    • tempMaxRange :=สูงสุดของ tempMaxRange และ nums[idx, pointers[idx]]
    • แทรก { nums[idx, pointers[idx]], idx } ลงใน pq
  • กำหนดอาร์เรย์ขนาด 2
  • ans[0] :=minRange, ans[1] :=maxRange
  • คืนสินค้า
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include ใช้เนมสเปซ std;void print_vector(vector v){ cout <<"["; for(int i =0; i a, คู่  b){ return !(a.first  smallestRange(vector>&nums) { int minRange =INT_MAX; int maxRange =INT_MIN; int rangeSize =INT_MAX; int tempMinRange, tempMaxRange, tempRangeSize; tempMinRange =INT_MAX; tempMaxRange =INT_MIN; int n =nums.size(); เวกเตอร์  พอยน์เตอร์(n); Priority_queue <คู่ , เวกเตอร์ <คู่ >, ตัวเปรียบเทียบ> pq; สำหรับ(int i =0; i  temp =pq.top(); pq.pop(); tempMinRange =temp.first; int idx =temp.second; ถ้า (tempMaxRange - tempMinRange  ans(2); ans[0] =minRange; ตอบ[1] =maxRange; กลับ ans; }};main(){ โซลูชัน ob; เวกเตอร์<เวกเตอร์> v ={{4,10,15,25,26},{0,9,14,20},{5,18,24,30}}; print_vector(ob.smallestRange(v));}

    อินพุต

    <ก่อน>{{4,10,15,25,26},{0,9,14,20},{5,18,24,30}};

    ผลลัพธ์

    [14, 18, ]