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

พิมพ์อาร์เรย์ย่อยทั้งหมดด้วยผลรวม 0 ใน C++


ในปัญหานี้ เราได้รับอาร์เรย์ของค่าจำนวนเต็มและเราต้องพิมพ์อาร์เรย์ย่อยทั้งหมดจากอาร์เรย์นี้ที่มีผลรวมเท่ากับ 0

มาดูตัวอย่างเพื่อทำความเข้าใจหัวข้อกันดีกว่า

Input: array = [-5, 0, 2, 3, -3, 4, -1]
Output:
Subarray with sum 0 is from 1 to 4.
Subarray with sum 0 is from 5 to 7
Subarray with sum 0 is from 0 to 7

เพื่อแก้ปัญหานี้ เราจะตรวจสอบอาร์เรย์ย่อยทั้งหมดที่เป็นไปได้ และตรวจสอบว่าผลรวมของอาร์เรย์ย่อยเหล่านี้เท่ากับ 0 แล้วพิมพ์ออกมาหรือไม่ วิธีแก้ปัญหานี้เข้าใจง่าย แต่วิธีแก้ปัญหานั้นซับซ้อน และความซับซ้อนของเวลานั้นอยู่ในลำดับ O(n^2) .

ทางออกที่ดีกว่าสำหรับปัญหานี้คือการใช้ Hashing สำหรับการแก้ปัญหานี้ เราจะหาผลรวมถ้ามันเท่ากับ 0 เพิ่มลงในตารางแฮช

อัลกอริทึม

Step 1: Create a sum variable.
Step 2: If sum =0, subarray starts from index 0 to end index of the array.
Step 3: If the current sum is in the hash table.
Step 4: If the sum exists, then subarray from i+1 to n must be zero.
Step 5: Else insert into the hash table.

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
vector< pair<int, int> > findSubArrayWithSumZero(int arr[], int n){
   unordered_map<int, vector<int> >map;
   vector <pair<int, int>> out;
   int sum = 0;
   for (int i = 0; i < n; i++){
      sum += arr[i];
      if (sum == 0)
         out.push_back(make_pair(0, i));
      if (map.find(sum) != map.end()){
         vector<int> vc = map[sum];
         for (auto it = vc.begin(); it != vc.end(); it++)
            out.push_back(make_pair(*it + 1, i));
      }
      map[sum].push_back(i);
   }
   return out;
}
int main(){
   int arr[] = {-5, 0, 2, 3, -3, 4, -1};
   int n = sizeof(arr)/sizeof(arr[0]);
   vector<pair<int, int> > out = findSubArrayWithSumZero(arr, n);
   if (out.size() == 0)
      cout << "No subarray exists";
   else
      for (auto it = out.begin(); it != out.end(); it++)
         cout<<"Subarray with sum 0 is from "<<it->first <<" to "<<it->second<<endl;
   return 0;
}

ผลลัพธ์

Subarray with sum 0 is from 1 to 1
Subarray with sum 0 is from 0 to 3
Subarray with sum 0 is from 3 to 4
Subarray with sum 0 is from 0 to 6
Subarray with sum 0 is from 4 to 6