给定一个只包含 0s 和 1s 的数组,找到包含相等数量的 0s 和 1s 的最大子数组。预期的时间复杂度为 O(n)。
例子:
Input: arr[] = {1, 0, 1, 1, 1, 0, 0}
Output: 1 to 6
(Starting and Ending indexes of output subarray)
Input: arr[] = {1, 1, 1, 1}
Output: No such subarray
Input: arr[] = {0, 0, 1, 1, 0}
Output: 0 to 3 Or 1 to 4
方法一:蛮力。
方法:这类问题的蛮力方法是生成所有可能的子阵列。然后首先检查子数组是否有相同数量的0和1 。为了使这一过程变得简单采取以0的为-1子阵列的累计值和1分的,因为它是。累积总和 = 0 的点将表示从开始到该点的子数组具有相同数量的0和1 。现在因为这是一个有效的子数组,将它的大小与迄今为止找到的此类子数组的最大大小进行比较。
算法 :
- 使用一个起始指针来表示子数组的起始点。
- 取一个变量sum=0 ,它将取所有子数组元素的累积总和。
- 如果起始点的值=1,则用值1初始化它,否则用-1初始化它。
- 现在开始一个内部循环并开始按照相同的逻辑计算元素的累积总和。
- 如果累积和(和的值)=0,则表示子数组具有相同数量的0 和 1 。
- 现在将其大小与最大子数组的大小进行比较,如果它更大,则将此类子数组的第一个索引存储在变量中并更新大小的值。
- 使用上述算法返回的起始索引和大小打印子数组。
伪代码:
Run a loop from i=0 to n-1
if(arr[i]==1)
sum=1
else
sum=-1
Run inner loop from j=i+1 to n-1
sum+=arr[j]
if(sum==0)
if(j-i+1>max_size)
start_index=i
max_size=j-i+1
Run a loop from i=start_index till max_size-1
print(arr[i])
C++
// A simple C++ program to find the largest
// subarray with equal number of 0s and 1s
#include
using namespace std;
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
int findSubArray(int arr[], int n)
{
int sum = 0;
int maxsize = -1, startindex;
// Pick a starting point as i
for (int i = 0; i < n - 1; i++) {
sum = (arr[i] == 0) ? -1 : 1;
// Consider all subarrays starting from i
for (int j = i + 1; j < n; j++) {
(arr[j] == 0) ? (sum += -1) : (sum += 1);
// If this is a 0 sum subarray, then
// compare it with maximum size subarray
// calculated so far
if (sum == 0 && maxsize < j - i + 1) {
maxsize = j - i + 1;
startindex = i;
}
}
}
if (maxsize == -1)
cout << "No such subarray";
else
cout << startindex << " to "
<< startindex + maxsize - 1;
return maxsize;
}
/* Driver code*/
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
findSubArray(arr, size);
return 0;
}
// This code is contributed by rathbhupendra
C
// A simple program to find the largest subarray
// with equal number of 0s and 1s
#include
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
int findSubArray(int arr[], int n)
{
int sum = 0;
int maxsize = -1, startindex;
// Pick a starting point as i
for (int i = 0; i < n - 1; i++) {
sum = (arr[i] == 0) ? -1 : 1;
// Consider all subarrays starting from i
for (int j = i + 1; j < n; j++) {
(arr[j] == 0) ? (sum += -1) : (sum += 1);
// If this is a 0 sum subarray, then
// compare it with maximum size subarray
// calculated so far
if (sum == 0 && maxsize < j - i + 1) {
maxsize = j - i + 1;
startindex = i;
}
}
}
if (maxsize == -1)
printf("No such subarray");
else
printf("%d to %d", startindex, startindex + maxsize - 1);
return maxsize;
}
/* Driver program to test above functions*/
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
findSubArray(arr, size);
return 0;
}
Java
class LargestSubArray {
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
int findSubArray(int arr[], int n)
{
int sum = 0;
int maxsize = -1, startindex = 0;
int endindex = 0;
// Pick a starting point as i
for (int i = 0; i < n - 1; i++) {
sum = (arr[i] == 0) ? -1 : 1;
// Consider all subarrays starting from i
for (int j = i + 1; j < n; j++) {
if (arr[j] == 0)
sum += -1;
else
sum += 1;
// If this is a 0 sum subarray, then
// compare it with maximum size subarray
// calculated so far
if (sum == 0 && maxsize < j - i + 1) {
maxsize = j - i + 1;
startindex = i;
}
}
}
endindex = startindex + maxsize - 1;
if (maxsize == -1)
System.out.println("No such subarray");
else
System.out.println(startindex + " to " + endindex);
return maxsize;
}
/* Driver program to test the above functions */
public static void main(String[] args)
{
LargestSubArray sub;
sub = new LargestSubArray();
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int size = arr.length;
sub.findSubArray(arr, size);
}
}
Python3
# A simple program to find the largest subarray
# with equal number of 0s and 1s
# This function Prints the starting and ending
# indexes of the largest subarray with equal
# number of 0s and 1s. Also returns the size
# of such subarray.
def findSubArray(arr, n):
sum = 0
maxsize = -1
# Pick a starting point as i
for i in range(0, n-1):
sum = -1 if(arr[i] == 0) else 1
# Consider all subarrays starting from i
for j in range(i + 1, n):
sum = sum + (-1) if (arr[j] == 0) else sum + 1
# If this is a 0 sum subarray, then
# compare it with maximum size subarray
# calculated so far
if (sum == 0 and maxsize < j-i + 1):
maxsize = j - i + 1
startindex = i
if (maxsize == -1):
print("No such subarray");
else:
print(startindex, "to", startindex + maxsize-1);
return maxsize
# Driver program to test above functions
arr = [1, 0, 0, 1, 0, 1, 1]
size = len(arr)
findSubArray(arr, size)
# This code is contributed by Smitha Dinesh Semwal
C#
// A simple program to find the largest subarray
// with equal number of 0s and 1s
using System;
class GFG {
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
static int findSubArray(int[] arr, int n)
{
int sum = 0;
int maxsize = -1, startindex = 0;
int endindex = 0;
// Pick a starting point as i
for (int i = 0; i < n - 1; i++) {
sum = (arr[i] == 0) ? -1 : 1;
// Consider all subarrays starting from i
for (int j = i + 1; j < n; j++) {
if (arr[j] == 0)
sum += -1;
else
sum += 1;
// If this is a 0 sum subarray, then
// compare it with maximum size subarray
// calculated so far
if (sum == 0 && maxsize < j - i + 1) {
maxsize = j - i + 1;
startindex = i;
}
}
}
endindex = startindex + maxsize - 1;
if (maxsize == -1)
Console.WriteLine("No such subarray");
else
Console.WriteLine(startindex + " to " + endindex);
return maxsize;
}
// Driver program
public static void Main()
{
int[] arr = { 1, 0, 0, 1, 0, 1, 1 };
int size = arr.Length;
findSubArray(arr, size);
}
}
// This code is contributed by Sam007
PHP
Javascript
C++
// C++ program to find largest subarray with equal number of
// 0's and 1's.
#include
using namespace std;
// Returns largest subarray with equal number of 0s and 1s
int maxLen(int arr[], int n)
{
// Creates an empty hashMap hM
unordered_map hM;
int sum = 0; // Initialize sum of elements
int max_len = 0; // Initialize result
int ending_index = -1;
for (int i = 0; i < n; i++)
arr[i] = (arr[i] == 0) ? -1 : 1;
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before, then update max_len
// if required
if (hM.find(sum) != hM.end()) {
if (max_len < i - hM[sum]) {
max_len = i - hM[sum];
ending_index = i;
}
}
else // Else put this sum in hash table
hM[sum] = i;
}
for (int i = 0; i < n; i++)
arr[i] = (arr[i] == -1) ? 0 : 1;
printf("%d to %d\n",
ending_index - max_len + 1, ending_index);
return max_len;
}
// Driver method
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
maxLen(arr, n);
return 0;
}
// This code is contributed by Aditya Goel
C
// A O(n) program to find the largest subarray
// with equal number of 0s and 1s
#include
#include
// A utility function to get maximum of two
// integers
int max(int a, int b) { return a > b ? a : b; }
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
int findSubArray(int arr[], int n)
{
// variables to store result values
int maxsize = -1, startindex;
// Create an auxiliary array sunmleft[].
// sumleft[i] will be sum of array
// elements from arr[0] to arr[i]
int sumleft[n];
// For min and max values in sumleft[]
int min, max;
int i;
// Fill sumleft array and get min and max
// values in it. Consider 0 values in arr[]
// as -1
sumleft[0] = ((arr[0] == 0) ? -1 : 1);
min = arr[0];
max = arr[0];
for (i = 1; i < n; i++) {
sumleft[i] = sumleft[i - 1]
+ ((arr[i] == 0) ? -1 : 1);
if (sumleft[i] < min)
min = sumleft[i];
if (sumleft[i] > max)
max = sumleft[i];
}
// Now calculate the max value of j - i such
// that sumleft[i] = sumleft[j]. The idea is
// to create a hash table to store indexes of all
// visited values.
// If you see a value again, that it is a case of
// sumleft[i] = sumleft[j]. Check if this j-i is
// more than maxsize.
// The optimum size of hash will be max-min+1 as
// these many different values of sumleft[i] are
// possible. Since we use optimum size, we need
// to shift all values in sumleft[] by min before
// using them as an index in hash[].
int hash[max - min + 1];
// Initialize hash table
for (i = 0; i < max - min + 1; i++)
hash[i] = -1;
for (i = 0; i < n; i++) {
// Case 1: when the subarray starts from
// index 0
if (sumleft[i] == 0) {
maxsize = i + 1;
startindex = 0;
}
// Case 2: fill hash table value. If already
// filled, then use it
if (hash[sumleft[i] - min] == -1)
hash[sumleft[i] - min] = i;
else {
if ((i - hash[sumleft[i] - min]) > maxsize) {
maxsize = i - hash[sumleft[i] - min];
startindex = hash[sumleft[i] - min] + 1;
}
}
}
if (maxsize == -1)
printf("No such subarray");
else
printf("%d to %d", startindex,
startindex + maxsize - 1);
return maxsize;
}
/* Driver program to test above functions */
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
findSubArray(arr, size);
return 0;
}
Java
import java.util.HashMap;
class LargestSubArray1 {
// Returns largest subarray with
// equal number of 0s and 1s
int maxLen(int arr[], int n)
{
// Creates an empty hashMap hM
HashMap hM
= new HashMap();
// Initialize sum of elements
int sum = 0;
// Initialize result
int max_len = 0;
int ending_index = -1;
int start_index = 0;
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == 0) ? -1 : 1;
}
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before,
// then update max_len if required
if (hM.containsKey(sum)) {
if (max_len < i - hM.get(sum)) {
max_len = i - hM.get(sum);
ending_index = i;
}
}
else // Else put this sum in hash table
hM.put(sum, i);
}
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == -1) ? 0 : 1;
}
int end = ending_index - max_len + 1;
System.out.println(end + " to " + ending_index);
return max_len;
}
/* Driver program to test the above functions */
public static void main(String[] args)
{
LargestSubArray1 sub = new LargestSubArray1();
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int n = arr.length;
sub.maxLen(arr, n);
}
}
// This code has been by Mayank Jaiswal(mayank_24)
Python3
# Python 3 program to find largest
# subarray with equal number of
# 0's and 1's.
# Returns largest subarray with
# equal number of 0s and 1s
def maxLen(arr, n):
# NOTE: Dictonary in python in
# implemented as Hash Maps.
# Create an empty hash map (dictionary)
hash_map = {}
curr_sum = 0
max_len = 0
ending_index = -1
for i in range (0, n):
if(arr[i] == 0):
arr[i] = -1
else:
arr[i] = 1
# Traverse through the given array
for i in range (0, n):
# Add current element to sum
curr_sum = curr_sum + arr[i]
# To handle sum = 0 at last index
if (curr_sum == 0):
max_len = i + 1
ending_index = i
# If this sum is seen before,
if curr_sum in hash_map:
# If max_len is smaller than new subarray
# Update max_len and ending_index
if max_len < i - hash_map[curr_sum]:
max_len = i - hash_map[curr_sum]
ending_index = i
else:
# else put this sum in dictionary
hash_map[curr_sum] = i
for i in range (0, n):
if(arr[i] == -1):
arr[i] = 0
else:
arr[i] = 1
print (ending_index - max_len + 1, end =" ")
print ("to", end = " ")
print (ending_index)
return max_len
# Driver Code
arr = [1, 0, 0, 1, 0, 1, 1]
n = len(arr)
maxLen(arr, n)
# This code is contributed
# by Tarun Garg
C#
// C# program to find the largest subarray
// with equal number of 0s and 1s
using System;
using System.Collections.Generic;
class LargestSubArray1 {
// Returns largest subarray with
// equal number of 0s and 1s
public virtual int maxLen(int[] arr, int n)
{
// Creates an empty Dictionary hM
Dictionary
hM = new Dictionary();
int sum = 0; // Initialize sum of elements
int max_len = 0; // Initialize result
int ending_index = -1;
int start_index = 0;
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == 0) ? -1 : 1;
}
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before,
// then update max_len
// if required
if (hM.ContainsKey(sum)) {
if (max_len < i - hM[sum]) {
max_len = i - hM[sum];
ending_index = i;
}
}
else // Else put this sum in hash table
{
hM[sum] = i;
}
}
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == -1) ? 0 : 1;
}
int end = ending_index - max_len + 1;
Console.WriteLine(end + " to " + ending_index);
return max_len;
}
// Driver Code
public static void Main(string[] args)
{
LargestSubArray1 sub = new LargestSubArray1();
int[] arr = new int[] {
1,
0,
0,
1,
0,
1,
1
};
int n = arr.Length;
sub.maxLen(arr, n);
}
}
// This code is contributed by Shrikant13
Javascript
输出:
0 to 5
复杂度分析:
- 时间复杂度: O(n^2)。
因为所有可能的子数组都是使用一对嵌套循环生成的。 - 辅助空间: O(1)。
因为没有使用额外的数据结构,占用辅助空间。
方法二: Hashmap。
方法:采用累积和的概念,将 0 取为 -1将有助于我们优化方法。在取累积和时,存在两种情况,即可以存在具有相同数量的 0 和 1 的子数组。
- 当累积 sum=0 时,表示从索引(0)到当前索引的子数组具有相同数量的0 和 1 。
- 当我们遇到之前已经遇到的累积和值时,这意味着从前一个索引 +1到当前索引的子数组具有相同数量的 0 和 1,因为它们的累积和为 0 。
简而言之,这个问题相当于在 array[] 中找到两个索引i & j 使得 array[i] = array[j] 和 (ji) 是最大值。为了存储每个唯一累积总和值的第一次出现,我们使用hash_map ,如果我们再次获得该值,我们可以找到子数组大小并将其与迄今为止找到的最大大小进行比较。
算法 :
- 设输入数组为大小为 n 的 arr[] ,而 max_size 为输出子数组的大小。
- 创建一个大小为 n 的临时数组 sumleft[]。在 sumleft[i] 中存储从 arr[0] 到 arr[i] 的所有元素的总和。
- 有两种情况,输出子数组可能从第 0 个索引开始,也可能从某个其他索引开始。我们将返回两种情况下获得的最大值。
- 要查找从第 0 个索引开始的最大长度子数组,请扫描 sumleft[] 并找到最大 i,其中 sumleft[i] = 0。
- 现在,我们需要找到子数组 sum 为 0 且起始索引不为 0 的子数组。 这个问题相当于在 sumleft[] 中找到两个索引 i & j 使得 sumleft[i] = sumleft[j] 和 ji 为最大值.为了解决这个问题,我们创建了一个 size = max-min+1 的哈希表,其中 min 是 sumleft[] 中的最小值,max 是 sumleft[] 中的最大值。散列 sumleft[] 中所有不同值的最左边出现。散列的大小选择为 max-min+1,因为 sumleft[] 中可以有这么多不同的可能值。将 hash 中的所有值初始化为 -1。
- 要填充和使用 hash[],请从 0 到 n-1 遍历 sumleft[]。如果 hash[] 中不存在某个值,则将其索引存储在 hash 中。如果该值存在,则计算 sumleft[] 的当前索引与之前存储在 hash[] 中的值的差值。如果此差异大于 maxsize,则更新 maxsize。
- 为了处理极端情况(全 1 和全 0),我们将 maxsize 初始化为 -1。如果 maxsize 保持为 -1,则打印没有这样的子数组。
伪代码:
int sum_left[n]
Run a loop from i=0 to n-1
if(arr[i]==0)
sumleft[i] = sumleft[i-1]+-1
else
sumleft[i] = sumleft[i-1]+-1
if (sumleft[i] > max)
max = sumleft[i];
Run a loop from i=0 to n-1
if (sumleft[i] == 0)
{
maxsize = i+1;
startindex = 0;
}
// Case 2: fill hash table value. If already
then use it
if (hash[sumleft[i]-min] == -1)
hash[sumleft[i]-min] = i;
else
{
if ((i - hash[sumleft[i]-min]) > maxsize)
{
maxsize = i - hash[sumleft[i]-min];
startindex = hash[sumleft[i]-min] + 1;
}
}
return maxsize
C++
// C++ program to find largest subarray with equal number of
// 0's and 1's.
#include
using namespace std;
// Returns largest subarray with equal number of 0s and 1s
int maxLen(int arr[], int n)
{
// Creates an empty hashMap hM
unordered_map hM;
int sum = 0; // Initialize sum of elements
int max_len = 0; // Initialize result
int ending_index = -1;
for (int i = 0; i < n; i++)
arr[i] = (arr[i] == 0) ? -1 : 1;
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before, then update max_len
// if required
if (hM.find(sum) != hM.end()) {
if (max_len < i - hM[sum]) {
max_len = i - hM[sum];
ending_index = i;
}
}
else // Else put this sum in hash table
hM[sum] = i;
}
for (int i = 0; i < n; i++)
arr[i] = (arr[i] == -1) ? 0 : 1;
printf("%d to %d\n",
ending_index - max_len + 1, ending_index);
return max_len;
}
// Driver method
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
maxLen(arr, n);
return 0;
}
// This code is contributed by Aditya Goel
C
// A O(n) program to find the largest subarray
// with equal number of 0s and 1s
#include
#include
// A utility function to get maximum of two
// integers
int max(int a, int b) { return a > b ? a : b; }
// This function Prints the starting and ending
// indexes of the largest subarray with equal
// number of 0s and 1s. Also returns the size
// of such subarray.
int findSubArray(int arr[], int n)
{
// variables to store result values
int maxsize = -1, startindex;
// Create an auxiliary array sunmleft[].
// sumleft[i] will be sum of array
// elements from arr[0] to arr[i]
int sumleft[n];
// For min and max values in sumleft[]
int min, max;
int i;
// Fill sumleft array and get min and max
// values in it. Consider 0 values in arr[]
// as -1
sumleft[0] = ((arr[0] == 0) ? -1 : 1);
min = arr[0];
max = arr[0];
for (i = 1; i < n; i++) {
sumleft[i] = sumleft[i - 1]
+ ((arr[i] == 0) ? -1 : 1);
if (sumleft[i] < min)
min = sumleft[i];
if (sumleft[i] > max)
max = sumleft[i];
}
// Now calculate the max value of j - i such
// that sumleft[i] = sumleft[j]. The idea is
// to create a hash table to store indexes of all
// visited values.
// If you see a value again, that it is a case of
// sumleft[i] = sumleft[j]. Check if this j-i is
// more than maxsize.
// The optimum size of hash will be max-min+1 as
// these many different values of sumleft[i] are
// possible. Since we use optimum size, we need
// to shift all values in sumleft[] by min before
// using them as an index in hash[].
int hash[max - min + 1];
// Initialize hash table
for (i = 0; i < max - min + 1; i++)
hash[i] = -1;
for (i = 0; i < n; i++) {
// Case 1: when the subarray starts from
// index 0
if (sumleft[i] == 0) {
maxsize = i + 1;
startindex = 0;
}
// Case 2: fill hash table value. If already
// filled, then use it
if (hash[sumleft[i] - min] == -1)
hash[sumleft[i] - min] = i;
else {
if ((i - hash[sumleft[i] - min]) > maxsize) {
maxsize = i - hash[sumleft[i] - min];
startindex = hash[sumleft[i] - min] + 1;
}
}
}
if (maxsize == -1)
printf("No such subarray");
else
printf("%d to %d", startindex,
startindex + maxsize - 1);
return maxsize;
}
/* Driver program to test above functions */
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
findSubArray(arr, size);
return 0;
}
Java
import java.util.HashMap;
class LargestSubArray1 {
// Returns largest subarray with
// equal number of 0s and 1s
int maxLen(int arr[], int n)
{
// Creates an empty hashMap hM
HashMap hM
= new HashMap();
// Initialize sum of elements
int sum = 0;
// Initialize result
int max_len = 0;
int ending_index = -1;
int start_index = 0;
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == 0) ? -1 : 1;
}
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before,
// then update max_len if required
if (hM.containsKey(sum)) {
if (max_len < i - hM.get(sum)) {
max_len = i - hM.get(sum);
ending_index = i;
}
}
else // Else put this sum in hash table
hM.put(sum, i);
}
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == -1) ? 0 : 1;
}
int end = ending_index - max_len + 1;
System.out.println(end + " to " + ending_index);
return max_len;
}
/* Driver program to test the above functions */
public static void main(String[] args)
{
LargestSubArray1 sub = new LargestSubArray1();
int arr[] = { 1, 0, 0, 1, 0, 1, 1 };
int n = arr.length;
sub.maxLen(arr, n);
}
}
// This code has been by Mayank Jaiswal(mayank_24)
蟒蛇3
# Python 3 program to find largest
# subarray with equal number of
# 0's and 1's.
# Returns largest subarray with
# equal number of 0s and 1s
def maxLen(arr, n):
# NOTE: Dictonary in python in
# implemented as Hash Maps.
# Create an empty hash map (dictionary)
hash_map = {}
curr_sum = 0
max_len = 0
ending_index = -1
for i in range (0, n):
if(arr[i] == 0):
arr[i] = -1
else:
arr[i] = 1
# Traverse through the given array
for i in range (0, n):
# Add current element to sum
curr_sum = curr_sum + arr[i]
# To handle sum = 0 at last index
if (curr_sum == 0):
max_len = i + 1
ending_index = i
# If this sum is seen before,
if curr_sum in hash_map:
# If max_len is smaller than new subarray
# Update max_len and ending_index
if max_len < i - hash_map[curr_sum]:
max_len = i - hash_map[curr_sum]
ending_index = i
else:
# else put this sum in dictionary
hash_map[curr_sum] = i
for i in range (0, n):
if(arr[i] == -1):
arr[i] = 0
else:
arr[i] = 1
print (ending_index - max_len + 1, end =" ")
print ("to", end = " ")
print (ending_index)
return max_len
# Driver Code
arr = [1, 0, 0, 1, 0, 1, 1]
n = len(arr)
maxLen(arr, n)
# This code is contributed
# by Tarun Garg
C#
// C# program to find the largest subarray
// with equal number of 0s and 1s
using System;
using System.Collections.Generic;
class LargestSubArray1 {
// Returns largest subarray with
// equal number of 0s and 1s
public virtual int maxLen(int[] arr, int n)
{
// Creates an empty Dictionary hM
Dictionary
hM = new Dictionary();
int sum = 0; // Initialize sum of elements
int max_len = 0; // Initialize result
int ending_index = -1;
int start_index = 0;
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == 0) ? -1 : 1;
}
// Traverse through the given array
for (int i = 0; i < n; i++) {
// Add current element to sum
sum += arr[i];
// To handle sum=0 at last index
if (sum == 0) {
max_len = i + 1;
ending_index = i;
}
// If this sum is seen before,
// then update max_len
// if required
if (hM.ContainsKey(sum)) {
if (max_len < i - hM[sum]) {
max_len = i - hM[sum];
ending_index = i;
}
}
else // Else put this sum in hash table
{
hM[sum] = i;
}
}
for (int i = 0; i < n; i++) {
arr[i] = (arr[i] == -1) ? 0 : 1;
}
int end = ending_index - max_len + 1;
Console.WriteLine(end + " to " + ending_index);
return max_len;
}
// Driver Code
public static void Main(string[] args)
{
LargestSubArray1 sub = new LargestSubArray1();
int[] arr = new int[] {
1,
0,
0,
1,
0,
1,
1
};
int n = arr.Length;
sub.maxLen(arr, n);
}
}
// This code is contributed by Shrikant13
Javascript
输出:
0 to 5
复杂度分析:
- 时间复杂度: O(n)。
因为给定的数组只遍历一次。 - 辅助空间: O(n)。
由于使用了hash_map ,这需要额外的空间。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。