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

ผลรวมของอาร์เรย์ย่อยสูงสุดใน O(n) โดยใช้ผลรวมนำหน้าใน C++


คำชี้แจงปัญหา

จากอาร์เรย์ของจำนวนเต็มบวกและจำนวนเต็มลบ ให้หาผลรวมของ Subarray สูงสุดในอาร์เรย์นั้น

ตัวอย่าง

หากอาร์เรย์อินพุตเป็น − {-12, -5, 4, -1, -7, 1, 8, -3} ดังนั้นเอาต์พุตจะเป็น 9

อัลกอริทึม

  • คำนวณผลรวมนำหน้าของอาร์เรย์อินพุต

  • Initialize− min_prefix_sum =0, res =-อนันต์

  • รักษาลูปสำหรับ i =0 ถึง n (n คือขนาดของอาร์เรย์อินพุต)

    • cand =prefix_sum[i] – มินิ

    • ถ้า แคน มากกว่า res (ผลรวมของ subarray สูงสุดจนถึงตอนนี้) จากนั้นให้อัปเดต res ด้วย cand

    • หาก prefix_sum[i] น้อยกว่า min_prefix_sum (ยอดรวมคำนำหน้าขั้นต่ำจนถึงตอนนี้) ให้อัปเดตmin_prefix_sumตาม prefix_sum[i]

  • ผลตอบแทน

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int maximumSumSubarray(int *arr, int n){
   int minPrefixSum = 0;
   int res = numeric_limits<int>::min();
   int prefixSum[n];
   prefixSum[0] = arr[0];
   for (int i = 1; i < n; i++) {
      prefixSum[i] = prefixSum[i - 1] + arr[i];
   }
   for (int i = 0; i < n; i++) {
      res = max(res, prefixSum[i] - minPrefixSum);
      minPrefixSum = min(minPrefixSum, prefixSum[i]);
   }
   return res;
}
int main(){
   int arr[] = {-12, -5, 4, -1, -7, 1, 8, -3};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Result = " << maximumSumSubarray(arr, n) <<endl;
   return 0;
}

ผลลัพธ์

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ต่อไปนี้ -

Result = 9