配列が与えられた場合 到着[] サイズの n タスクは、合計を持つ配列内のすべての部分配列を出力することです。 。
例:
入力: arr = [6 3 -1 -3 4 -2 2 4 6 -12 -7]
出力:文字列とJavaインデックス 2 ~ 4 でサブ配列が見つかりました
インデックス 2 ~ 6 でサブ配列が見つかりました
インデックス 5 から 6 でサブ配列が見つかりました
インデックス 6 ~ 9 でサブ配列が見つかりました
インデックス 0 から 10 までのサブ配列が見つかりました入力: arr = [1 2 -3 3 -1 -1]
出力:
職員選考委員会の意味インデックス 0 から 2 までのサブ配列が見つかりました
インデックス 2 から 3 でサブ配列が見つかりました
インデックス 3 ~ 5 でサブ配列が見つかりました
[素朴なアプローチ] 考えられるすべての部分配列を生成することによって - O(n2) 時間と O(1) 補助空間
C++非常に基本的なアプローチは次のことを考慮することです。 考えられるすべての部分配列 そしてそれらの合計がゼロかどうかを確認します。このアプローチは単純ですが、大規模な配列の場合も非効率的です。
// C++ program to print all subarrays // in the array which has sum 0 #include using namespace std; vector<pair<int int> > findSubArrays(int arr[] int n) { // Array to store all the start and end // indices of subarrays with 0 sum vector<pair<int int> > output; for (int i = 0; i < n; i++) { int prefix = 0; for (int j = i; j < n; j++) { prefix += arr[j]; if (prefix == 0) output.push_back({ i j }); } } return output; } // Function to print all subarrays with 0 sum void print(vector<pair<int int> > output) { for (auto it = output.begin(); it != output.end(); it++) cout << 'Subarray found from Index ' << it->first << ' to ' << it->second << endl; } // Driver code int main() { // Given array int arr[] = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = sizeof(arr) / sizeof(arr[0]); // Function Call vector<pair<int int> > output = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (output.size() == 0) { cout << 'No subarray exists'; } else { print(output); } return 0; }
Java // Java program to print all subarrays // in the array which has sum 0 import java.io.*; import java.util.*; // User defined pair class class Pair { int first second; Pair(int a int b) { first = a; second = b; } } public class GFG { static ArrayList<Pair> findSubArrays(int[] arr int n) { // Array to store all the start and end // indices of subarrays with 0 sum ArrayList<Pair> out = new ArrayList<>(); for (int i = 0; i < n; i++) { int prefix = 0; for (int j = i; j < n; j++) { prefix += arr[j]; if (prefix == 0) out.add(new Pair(i j)); } } return out; } // Function to print all subarrays with 0 sum static void print(ArrayList<Pair> out) { for (int i = 0; i < out.size(); i++) { Pair p = out.get(i); System.out.println('Subarray found from Index ' + p.first + ' to ' + p.second); } } // Driver code public static void main(String args[]) { // Given array int[] arr = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = arr.length; // Function Call ArrayList<Pair> out = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (out.size() == 0) System.out.println('No subarray exists'); else print(out); } }
Python # User defined pair class class Pair: first = 0 second = 0 def __init__(self a b): self.first = a self.second = b class GFG: @staticmethod def findSubArrays(arr n): # Array to store all the start and end # indices of subarrays with 0 sum out = [] i = 0 while (i < n): prefix = 0 j = i while (j < n): prefix += arr[j] if (prefix == 0): out.append(Pair(i j)) j += 1 i += 1 return out # Function to print all subarrays with 0 sum @staticmethod def print(out): i = 0 while (i < len(out)): p = out[i] print('Subarray found from Index ' + str(p.first) + ' to ' + str(p.second)) i += 1 # Driver code @staticmethod def main(args): # Given array arr = [6 3 -1 -3 4 -2 2 4 6 -12 -7] n = len(arr) # Function Call out = GFG.findSubArrays(arr n) # if we didn't find any subarray with 0 sum # then subarray doesn't exists if (len(out) == 0): print('No subarray exists') else: GFG.print(out) if __name__ == '__main__': GFG.main([])
C# using System; using System.Collections.Generic; class GFG { // Array to store all the start and end // indices of subarrays with 0 sum static List<Tuple<int int>> findSubArrays(int[] arr int n) { var output = new List<Tuple<int int>>(); for (int i = 0; i < n; i++) { int prefix = 0; for (int j = i; j < n; j++) { prefix += arr[j]; if (prefix == 0) output.Add(Tuple.Create(i j)); } } return output; } // Function to print all subarrays with 0 sum static void print(List<Tuple<int int>> output) { foreach (var subArray in output) Console.Write('Subarray found from Index ' + subArray.Item1 + ' to ' + subArray.Item2+'n'); } // Driver code public static void Main() { // Given array int[] arr = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = arr.Length; // Function Call List<Tuple<int int>> output = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (output.Count == 0) { Console.WriteLine('No subarray exists'); } else { print(output); } } }
JavaScript // Javascript program to print all subarrays // in the array which has sum 0 function findSubArrays(arr n) { // Array to store all the start and end // indices of subarrays with 0 sum let out =[]; for (let i = 0; i < n; i++) { let prefix = 0; for (let j = i; j < n; j++) { prefix += arr[j]; if (prefix == 0) out.push([i j]); } } return out; } // Function to print all subarrays with 0 sum function print(out) { for (let it of out) console.log('Subarray found from Index ' + it[0] + ' to ' + it[1]); } // Driver code // Given array let arr = [ 6 3 -1 -3 4 -2 2 4 6 -12 -7 ]; let n = arr.length ; // Function Call let out = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (out.length == 0) { console.log('No subarray exists'); } else { print(out); }
出力
Subarray found from Index 0 to 10 Subarray found from Index 2 to 4 Subarray found from Index 2 to 6 Subarray found from Index 5 to 6 Subarray found from Index 6 to 9
時間計算量: の上2) 2 つのループを使用しているためです。
補助スペース: O(1) は一定の追加スペースが必要です。
【想定されるアプローチ】 ハッシュ化 - O(n) 時間と O(n) 補助空間
C++より効率的なアプローチは、ハッシュを使用して要素とそのインデックスの累積合計を保存することです。これにより、一定時間内にゼロ和の部分配列が存在するかどうかをチェックできます。
JavaScript ドロップダウン以下に直感の詳細な手順を示します。
- ハッシュ マップを作成して、累積合計と対応するインデックスを保存します。
- 累積和をゼロに初期化します。
- 配列を走査します。
- 現在の要素を累積合計に加算します。
- 累積合計がゼロの場合、先頭から現在のインデックスまでの部分配列が見つかります。
- 累積和がすでにハッシュ マップに存在する場合は、和がゼロの部分配列が存在することを意味します。
- 累積合計とインデックスをハッシュ マップに保存します。
// C++ program to print all subarrays // in the array which has sum 0 #include using namespace std; // Function to print all subarrays in the array which // has sum 0 vector<pair<int int> > findSubArrays(int arr[] int n) { // create an empty map unordered_map<int vector<int> > map; // create an empty vector of pairs to store // subarray starting and ending index vector<pair<int int> > out; // Maintains sum of elements so far int sum = 0; for (int i = 0; i < n; i++) { // add current element to sum sum += arr[i]; // if sum is 0 we found a subarray starting // from index 0 and ending at index i if (sum == 0) out.push_back(make_pair(0 i)); // If sum already exists in the map there exists // at-least one subarray ending at index i with // 0 sum if (map.find(sum) != map.end()) { // map[sum] stores starting index of all // subarrays vector<int> vc = map[sum]; for (auto it = vc.begin(); it != vc.end(); it++) out.push_back(make_pair(*it + 1 i)); } // Important - no else map[sum].push_back(i); } // return output vector return out; } // Utility function to print all subarrays with sum 0 void print(vector<pair<int int> > out) { for (auto it = out.begin(); it != out.end(); it++) cout << 'Subarray found from Index ' << it->first << ' to ' << it->second << endl; } // Driver code int main() { int arr[] = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = sizeof(arr) / sizeof(arr[0]); vector<pair<int int> > out = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (out.size() == 0) cout << 'No subarray exists'; else print(out); return 0; }
Java // Java program to print all subarrays // in the array which has sum 0 import java.io.*; import java.util.*; // User defined pair class class Pair { int first second; Pair(int a int b) { first = a; second = b; } } public class GFG { // Function to print all subarrays in the array which // has sum 0 static ArrayList<Pair> findSubArrays(int[] arr int n) { // create an empty map HashMap<Integer ArrayList<Integer> > map = new HashMap<>(); // create an empty vector of pairs to store // subarray starting and ending index ArrayList<Pair> out = new ArrayList<>(); // Maintains sum of elements so far int sum = 0; for (int i = 0; i < n; i++) { // add current element to sum sum += arr[i]; // if sum is 0 we found a subarray starting // from index 0 and ending at index i if (sum == 0) out.add(new Pair(0 i)); ArrayList<Integer> al = new ArrayList<>(); // If sum already exists in the map there exists // at-least one subarray ending at index i with // 0 sum if (map.containsKey(sum)) { // map[sum] stores starting index of all // subarrays al = map.get(sum); for (int it = 0; it < al.size(); it++) { out.add(new Pair(al.get(it) + 1 i)); } } al.add(i); map.put(sum al); } return out; } // Utility function to print all subarrays with sum 0 static void print(ArrayList<Pair> out) { for (int i = 0; i < out.size(); i++) { Pair p = out.get(i); System.out.println('Subarray found from Index ' + p.first + ' to ' + p.second); } } // Driver code public static void main(String args[]) { int[] arr = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = arr.length; ArrayList<Pair> out = findSubArrays(arr n); // if we did not find any subarray with 0 sum // then subarray does not exists if (out.size() == 0) System.out.println('No subarray exists'); else print(out); } }
Python # Python3 program to print all subarrays # in the array which has sum 0 # Function to get all subarrays # in the array which has sum 0 def findSubArrays(arr n): # create a python dict hashMap = {} # create a python list # equivalent to ArrayList out = [] # tracker for sum of elements sum1 = 0 for i in range(n): # increment sum by element of array sum1 += arr[i] # if sum is 0 we found a subarray starting # from index 0 and ending at index i if sum1 == 0: out.append((0 i)) al = [] # If sum already exists in the map # there exists at-least one subarray # ending at index i with 0 sum if sum1 in hashMap: # map[sum] stores starting index # of all subarrays al = hashMap.get(sum1) for it in range(len(al)): out.append((al[it] + 1 i)) al.append(i) hashMap[sum1] = al return out # Utility function to print # all subarrays with sum 0 def printOutput(output): for i in output: print('Subarray found from Index ' + str(i[0]) + ' to ' + str(i[1])) # Driver Code if __name__ == '__main__': arr = [6 3 -1 -3 4 -2 2 4 6 -12 -7] n = len(arr) out = findSubArrays(arr n) # if we did not find any subarray with 0 sum # then subarray does not exists if (len(out) == 0): print('No subarray exists') else: printOutput(out)
C# // C# program to print all subarrays // in the array which has sum 0 using System; using System.Collections.Generic; // User defined pair class class Pair { public int first second; public Pair(int a int b) { first = a; second = b; } } class GFG { // Function to print all subarrays // in the array which has sum 0 static List<Pair> findSubArrays(int[] arr int n) { // create an empty map Dictionary<int List<int> > map = new Dictionary<int List<int> >(); // create an empty vector of pairs to store // subarray starting and ending index List<Pair> outt = new List<Pair>(); // Maintains sum of elements so far int sum = 0; for (int i = 0; i < n; i++) { // add current element to sum sum += arr[i]; // if sum is 0 we found a subarray starting // from index 0 and ending at index i if (sum == 0) outt.Add(new Pair(0 i)); List<int> al = new List<int>(); // If sum already exists in the map there exists // at-least one subarray ending at index i with // 0 sum if (map.ContainsKey(sum)) { // map[sum] stores starting index // of all subarrays al = map[sum]; for (int it = 0; it < al.Count; it++) { outt.Add(new Pair(al[it] + 1 i)); } } al.Add(i); if (map.ContainsKey(sum)) map[sum] = al; else map.Add(sum al); } return outt; } // Utility function to print all subarrays with sum 0 static void print(List<Pair> outt) { for (int i = 0; i < outt.Count; i++) { Pair p = outt[i]; Console.WriteLine('Subarray found from Index ' + p.first + ' to ' + p.second); } } // Driver code public static void Main(String[] args) { int[] arr = { 6 3 -1 -3 4 -2 2 4 6 -12 -7 }; int n = arr.Length; List<Pair> outt = findSubArrays(arr n); // if we did not find any subarray with 0 sum // then subarray does not exists if (outt.Count == 0) Console.WriteLine('No subarray exists'); else print(outt); } }
JavaScript // JavaScript program to print all subarrays // in the array which has sum 0 // Function to print all subarrays in the array which // has sum 0 function findSubArrays(arr n) { // create an empty map let map = {}; // create an empty vector of pairs to store // subarray starting and ending index let out = []; // Maintains sum of elements so far let sum = 0; for (var i = 0; i < n; i++) { // add current element to sum sum += arr[i]; // if sum is 0 we found a subarray starting // from index 0 and ending at index i if (sum == 0) out.push([0 i]); // If sum already exists in the map there exists // at-least one subarray ending at index i with // 0 sum if (map.hasOwnProperty(sum)) { // map[sum] stores starting index of all subarrays let vc = map[sum]; for (let it of vc) out.push([it + 1 i]); } else map[sum] = []; // Important - no else map[sum].push(i); } // return output vector return out; } // Utility function to print all subarrays with sum 0 function print(out) { for (let it of out) console.log('Subarray found from Index ' + it[0] + ' to ' + it[1]); } // Driver code let arr = [6 3 -1 -3 4 -2 2 4 6 -12 -7]; let n = arr.length; let out = findSubArrays(arr n); // if we didn’t find any subarray with 0 sum // then subarray doesn’t exists if (out.length == 0) console.log('No subarray exists'); else print(out);
出力
Subarray found from Index 2 to 4 Subarray found from Index 2 to 6 Subarray found from Index 5 to 6 Subarray found from Index 6 to 9 Subarray found from Index 0 to 10
時間計算量: O(n) ここで、n は配列内の要素の数です。
補助スペース: ハッシュ マップを保存するための O(n)。