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

Subarray เฉลี่ยสูงสุด II ใน C ++


สมมติว่าเรามีอาร์เรย์ที่มีจำนวนเต็ม n ตัว เราต้องหาอาร์เรย์ย่อยที่อยู่ติดกันซึ่งมีความยาวมากกว่าหรือเท่ากับ k ที่มีค่าเฉลี่ยสูงสุด เราต้องหาค่าเฉลี่ยสูงสุด

ดังนั้น หากอินพุตเป็น [1,12,-5,-6,50,3] k =4 เอาต์พุตจะเป็น 12.75 เช่นเมื่อความยาวเท่ากับ 5 ค่าเฉลี่ยสูงสุดคือ 10.8 เมื่อความยาวเท่ากับ 6 , ค่าเฉลี่ยสูงสุดคือ 9.16667 ดังนั้นเอาต์พุตคือ 12.75

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

  • กำหนดฟังก์ชัน ok() ซึ่งจะใช้ x, ตัวเลขอาร์เรย์, k,

  • n :=ขนาดของ nums

  • กำหนดขนาดอาร์เรย์ arr:n.

  • สำหรับการเริ่มต้น i :=0 เมื่อ i

    • arr[i] :=nums[i] - x

  • ผลรวม :=0, สุดท้าย :=0

  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน

    • sum :=sum + arr[i]

  • ถ้าผลรวม>=0 แล้ว −

    • คืนความจริง

  • สำหรับการเริ่มต้น i :=0, j :=k เมื่อ j

    • สุดท้าย :=สุดท้าย + arr[i]

    • sum :=sum + arr[j]

    • ถ้าสุดท้าย <0 แล้ว −

      • sum :=sum - สุดท้าย

      • สุดท้าย :=0

    • ถ้าผลรวม>=0 แล้ว −

      • คืนความจริง

  • คืนค่าเท็จ

  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −

  • ret :=0, ต่ำ :=-inf, สูง :=inf

  • สูง-ต่ำ> 10^-5 ทำ

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

    • ถ้า ok(mid, nums, k) เป็นจริง −

      • ต่ำ :=กลาง

      • ret :=กลาง

    • มิฉะนั้น

      • สูง :=กลาง

  • รีเทิร์น

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool ok(double x, vector <int>& nums, int k){
      int n = nums.size();
      double arr[n];
      for (int i = 0; i < n; i++) {
         arr[i] = nums[i] - x;
      }
      double sum = 0;
      double last = 0;
      for (int i = 0; i < k; i++) {
         sum += arr[i];
      }
      if (sum >= 0)
      return true;
      for (int i = 0, j = k; j < n; i++, j++) {
         last += arr[i];
         sum += arr[j];
         if (last < 0) {
            sum -= last;
            last = 0;
         }
         if (sum >= 0)
         return true;
      }
      return false;
   }
   double findMaxAverage(vector<int>& nums, int k) {
      double ret = 0;
      double low = INT_MIN;
      double high = INT_MAX;
      while (high - low > 1e-5) {
         double mid = low + (high - low) / 2;
         if (ok(mid, nums, k)) {
            low = mid;
            ret = mid;
         } else {
            high = mid;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,12,-5,-6,50,3};
   cout << (ob.findMaxAverage(v, 4));
}

อินพุต

{1,12,-5,-6,50,3},4

ผลลัพธ์

12.75000