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

ผลรวมสูงสุดของ 3 Subarrays ที่ไม่ทับซ้อนกันใน C++


สมมติว่าเรามีหนึ่งอาร์เรย์ที่เรียกว่า nums ของจำนวนเต็มบวก เราต้องหาอาร์เรย์ย่อยที่ไม่ทับซ้อนกันสามชุดที่มีผลรวมสูงสุด ที่นี่แต่ละ subarray จะมีขนาด k และเราต้องการเพิ่มผลรวมของรายการ 3*k ทั้งหมดให้สูงสุด

เราต้องหาผลลัพธ์เป็นรายการดัชนีแทนตำแหน่งเริ่มต้นของแต่ละช่วงเวลา หากมีหลายคำตอบ เราจะส่งคืนคำตอบที่เล็กที่สุดเกี่ยวกับพจนานุกรม

ดังนั้นหากอินพุตเป็น [1,2,1,2,6,8,4,1] และ k =2 ผลลัพธ์จะเป็น [0,3,5] ดังนั้นอาร์เรย์ย่อยคือ [1,2] [2,6], [8,4] สอดคล้องกับดัชนีเริ่มต้น [0,3,5].

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

  • n :=ขนาดของ nums
  • กำหนดอาร์เรย์ ret ขนาด 3 เติมด้วย inf
  • กำหนดผลรวมอาร์เรย์ของขนาด n + 1
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • sum[i + 1] =ผลรวม[i] + nums[i]
  • กำหนดอาร์เรย์ posLeft ของขนาด n
  • กำหนดอาร์เรย์ posRight ของขนาด n เติมด้วย n - k
  • สำหรับการเริ่มต้น i :=k, currMax :=sum[k] - sum[0], เมื่อ i
  • newTotal :=sum[i + 1] - sum[i + 1 - k]
  • ถ้า newTotal> currMax แล้ว −
    • currMax :=newTotal
    • posLeft[i] :=i + 1 - k
  • มิฉะนั้น
    • posLeft[i] :=posLeft[i - 1]
  • สำหรับการเริ่มต้น i :=n - k - 1, currMax :=sum[n] - sum[n - k], เมื่อ i>=0, อัปเดต (ลดลง i โดย 1), ทำ −
    • newTotal :=sum[i + k] - sum[i]
    • ถ้า newTotal>=currMax แล้ว −
      • currMax :=newTotal
      • posRight[i] :=ฉัน
    • มิฉะนั้น
      • posRight[i] :=posRight[i + 1]
  • req :=0
  • สำหรับการเริ่มต้น i :=k เมื่อฉัน <=n - 2 * k อัปเดต (เพิ่ม i โดย 1) ทำ −
    • l :=posLeft[i - 1], r :=posRight[i + k]
    • อุณหภูมิ :=(sum[l + k] - sum[l]) + (sum[i + k] - sum[i]) + (sum[r + k] - sum[r])
    • ถ้า temp> req แล้ว −
      • ret[0] :=l, ret[1] :=i, ret[2] :=r
      • req :=อุณหภูมิ
  • คืนสินค้า
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
          int n = nums.size();
          vector <int> ret(3, INT_MAX);
          vector <int> sum(n + 1);
          for(int i = 0; i < n; i++){
             sum[i + 1] = sum[i] + nums[i];
          }
          vector <int> posLeft(n);
          vector <int> posRight(n, n - k);
          for(int i = k, currMax = sum[k] - sum[0]; i < n; i++){
             int newTotal = sum[i + 1] - sum[i + 1- k];
             if(newTotal > currMax){
                currMax = newTotal;
                posLeft[i] = i + 1 - k;
             }else{
                posLeft[i] = posLeft[i - 1];
             }
          }
          for(int i = n - k - 1, currMax = sum[n] - sum[n - k]; i >=0 ; i--){
             int newTotal = sum[i + k] - sum[i];
             if(newTotal >= currMax){
                currMax = newTotal;
                posRight[i] = i;
             }else{
                posRight[i] = posRight[i + 1];
             }
          }
          int req = 0;
          for(int i = k; i <= n - 2 * k; i++){
             int l = posLeft[i - 1];
             int r = posRight[i + k];
             int temp = (sum[l + k] - sum[l]) + (sum[i + k] - sum[i]) + (sum[r + k] - sum[r]);
             if(temp > req){
                ret[0] = l;
                ret[1] = i;
                ret[2] = r;
                req = temp;
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,2,1,2,6,8,4,1};
       print_vector(ob.maxSumOfThreeSubarrays(v, 2));
    }

    อินพุต

    {1,2,1,2,6,8,4,1}
    2

    ผลลัพธ์

    [0, 3, 5, ]