編寫一個 C++ 程式來查詢和為零的最大子陣列的長度。
假設我們給定一個包含 N 個整數的陣列,任務是找到長度最大的子陣列。如果沒有任何子陣列的長度最大或和等於 0,則返回 '0'。例如:
輸入-1 −
N = 8 A[ ] = {15, -5, -1, 5,1, 4 }
輸出 −
4
說明 − 和為零的最大子陣列是 {-5, -1, 5, 1},長度為 4。
輸入-2 −
N = 5 A[ ] = {3, 2 ,4, 8, -1}
輸出 −
0
說明 − 由於不存在和等於零的子陣列,因此輸出為 '0'。
解決此問題的方法
有幾種方法可以解決這個問題。最合適的演算法是使用雜湊表,可以線上性時間 O(n) 內解決。
其思想是建立一個雜湊表,儲存所有子陣列的和,其中和作為鍵,索引作為值。
我們將首先遍歷整個陣列並存儲當前和。我們將檢查雜湊表中是否存在當前和。如果存在於雜湊表中,則更新子陣列的最大長度。
輸入陣列大小 N。
函式 `lenMax(int *arr, int size)` 接收一個數組及其大小作為輸入,返回包含和為零的最大子陣列的長度。
一個無序整數對映,其中鍵為和,值為索引,用於檢查是否有任何和重複。
迭代陣列元素並找到陣列的當前和,如果和存在於雜湊表中,則找到子陣列的最大長度。如果沒有,則將新和及其索引插入雜湊表。
返回最大長度作為輸出。
示例
#include<bits/stdc++.h> using namespace std; int lenMax(int *arr, int size){ unordered_map<int,int>mp; int sum=0; int maxlen=0; for(int i=0;i<size;i++){ sum+=arr[i]; if(arr[i]==0 && maxlen==0){ maxlen=1; } if(sum==0){ maxlen=i+1; } if(mp.find(sum)!= mp.end()){ maxlen= max(maxlen, i-mp[sum]); } else { mp[sum]=i; } } return maxlen; } int main(){ int N=6; int A[N]={15,-2,2,-8,1,7,10,23}; cout<<lenMax(A,N)<<endl; return 0; }
輸出
如果執行以上程式碼,它將輸出:
5
和為 0 的最大子陣列是 {-2, 2, -8, 1, 7}。因此,最大子陣列的長度為 '5'。
廣告