0 和 1 数量相等的最长子序列
给定一个二进制数组,任务是找到具有相同数量的 0 和 1 的最大子序列的大小。
例子 :
Input : arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 }
Output: 6
Input : arr[] = { 0, 0, 1, 1, 1, 1, 1, 0, 0 }
Output : 8
简单的解决方案是我们生成所有可能的 sub_sequence 并找到哪个 sub_sequence 具有相同数量的零和一(它的大小应该是最大的)。
下面是上述想法的实现
C++
#include
using namespace std;
int generateSubsequences(int arr[],
int n)
{
// store the maximum length
// sub_sequence having equal
// number of zeros and ones
int result = 0;
// Number of subsequences is (2**n -1)
unsigned int opsize = pow(2, n);
// Run from counter 000..1 to 111..1
for (int counter = 1; counter < opsize;
counter++)
{
// store count of zeros and one
int countzero = 0;
int countone = 0, current_size = 0;
for (int j = 0; j < n; j++)
{
// Check if jth bit in the
// counter is set. If set
// then print jth element
// from arr[]
if (counter & (1 << j))
{
if (arr[j])
countone++;
else
countzero++;
current_size++;
}
}
// update maximum size
if (countzero == countone)
result = max(current_size,
result);
}
return result;
}
// Driver Code
int main()
{
int arr[] = { 1, 0, 0, 1,
0, 0, 0, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "largest Subsequences having "
"equal number of 0 & 1 is "
<< generateSubsequences(arr, n);
return 0;
}
Java
// Java program for Longest subsequence
// having equal numbers of 0 and 1
import java.io.*;
class GFG {
static int generateSubsequences(int arr[],
int n)
{
// store the maximum length
// sub_sequence having equal
// number of zeros and ones
int result = 0;
// Number of subsequences
// is (2**n -1)
long opsize = (long) Math.pow(2, n);
// Run from counter
// 000..1 to 111..1
for (int counter = 1; counter < opsize;
counter++)
{
// store count of zeros and one
int countzero = 0;
int countone = 0, current_size = 0;
for (int j = 0; j < n; j++)
{
// Check if jth bit in the
// counter is set. If set
// then print jth element
// from arr[]
if ((counter & (1 << j))>0)
{
if (arr[j]>0)
countone++;
else
countzero++;
current_size++;
}
}
// update maximum size
if (countzero == countone)
result = Math.max(current_size,
result);
}
return result;
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 1, 0, 0, 1,
0, 0, 0, 1 };
int n = arr.length;
System.out.println( "largest Subsequences having "+
"equal number of 0 & 1 is "+
generateSubsequences(arr, n));
}
}
// This code is contributed by anuj_67.
Python3
# Python code to find the
# length of longest subsequence
# having equal no of 1 and 0
def generateSubsequences(a, n):
result = 0
# Number of subsequences
# is (2**n -1)
opsize = 2**n
# Run from counter
# 000..1 to 111..1
for counter in range(opsize):
# store count of zeros and one
countzero, countone = 0, 0
current_size = 0
for j in range(n):
# Check if jth bit in the
# counter is set. If set then
# print jth element from arr[]
if counter & (1 << j):
if arr[j] == True:
countone += 1
else:
countzero += 1
current_size += 1
# update maximum size
if countzero == countone:
result = max(current_size,
result)
return result
# Driver code
arr = [ 1, 0, 0, 1, 0, 0, 0, 1 ]
n = len(arr)
print("largest Subsequences having" +
" equal number of 0 & 1 is ",
generateSubsequences(arr, n))
# This code is contributed
# by "Abhishek Sharma 44"
C#
// C# program for Longest subsequence
// having equal numbers of 0 and 1
using System;
class GFG {
static int generateSubsequences(int []arr,
int n)
{
// store the maximum length
// sub_sequence having equal
// number of zeros and ones
int result = 0;
// Number of subsequences
// is (2**n -1)
uint opsize = (uint) Math.Pow(2, n);
// Run from counter
// 000..1 to 111..1
for (int counter = 1; counter < opsize;
counter++)
{
// store count of zeros and one
int countzero = 0;
int countone = 0, current_size = 0;
for (int j = 0; j < n; j++)
{
// Check if jth bit in the
// counter is set. If set
// then print jth element
// from arr[]
if ((counter & (1 << j))>0)
{
if (arr[j]>0)
countone++;
else
countzero++;
current_size++;
}
}
// update maximum size
if (countzero == countone)
result = Math.Max(current_size,
result);
}
return result;
}
// Driver Code
public static void Main ()
{
int []arr = { 1, 0, 0, 1,
0, 0, 0, 1 };
int n = arr.Length;
Console.WriteLine("largest Subsequences having "+
"equal number of 0 & 1 is "+
generateSubsequences(arr, n));
}
}
// This code is contributed by anuj_67.
PHP
Javascript
C++
// Efficient CPP program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
#include
using namespace std;
int largestSubsequences(int arr[], int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and count
// zeros and ones
for (int i = 0; i < n; i++)
if (arr[i])
countone++;
else
countzero++;
return min(countone, countzero) * 2;
}
// Driver program
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "largest Subsequences having "
<< "equal number of 0 & 1 is "
<< largestSubsequences(arr, n);
return 0;
}
Java
// Efficient Java program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
import java.io.*;
import java.math.*;
class GFG
{
static int largestSubsequences(int arr[],
int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and count
// zeros and ones
for (int i = 0; i < n; i++)
if (arr[i] == 1)
countone++;
else
countzero++;
return Math.min(countone, countzero) * 2;
}
// Driver Code
public static void main(String args[])
{
int arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = arr.length;
System.out.println("largest Subsequences having " +
"equal number of 0 & 1 is " +
largestSubsequences(arr, n));
}
}
// This code is contributed by Nikita Tiwari
Python3
# Efficient Pyhton code to find
# length of the longest subsequence
# with equal number of 0s and 1s.
def largestSubsequence(arr,n):
# store count of zeros and one
countzero = 0
countone = 0
# traverse binary array and count
# zeros and ones
for i in range(n):
if arr[i]:
countone += 1
else:
countzero += 1
return min(countone, countzero) * 2
# Driver Code
arr = [ 1, 0, 0, 1, 0, 0, 0, 1 ]
n = len(arr)
print("largest Subsequences having" +
" equal number of 0 & 1 is ",
largestSubsequence(arr, n))
# This code is contributed
# by "Abhishek Sharma 44"
C#
// Efficient C# program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
using System;
class GFG
{
static int largestSubsequences(int[] arr,
int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and
// count zeros and ones
for (int i = 0; i < n; i++)
if (arr[i] != 0)
countone++;
else
countzero++;
return Math.Min(countone,
countzero) * 2;
}
// Driver Code
static void Main()
{
int[] arr = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = 8 ;
Console.Write("largest Subsequences having" +
" equal number of 0 & 1 is " +
largestSubsequences(arr, n));
}
}
// This code is contributed by Anuj_67
PHP
Javascript
输出:
largest Subsequences having equal number of 0 & 1 is 6
时间复杂度:(n*2^n)
有效的解决方案是计算二进制数组中的零和一,最后通过将零和一的计数乘以 2 来返回最小值。
arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 }
output : 6
here larges sub_sequencer :
{ 1 0 0 1 0 1} or {1 0 1 0 0 1 }
If we observe carefully then we notice that
we just have to find minimum counts between
zeros & ones and multiplying it with 2
( because we always get even length sub_sequence)
下面是上述想法的实现
C++
// Efficient CPP program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
#include
using namespace std;
int largestSubsequences(int arr[], int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and count
// zeros and ones
for (int i = 0; i < n; i++)
if (arr[i])
countone++;
else
countzero++;
return min(countone, countzero) * 2;
}
// Driver program
int main()
{
int arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "largest Subsequences having "
<< "equal number of 0 & 1 is "
<< largestSubsequences(arr, n);
return 0;
}
Java
// Efficient Java program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
import java.io.*;
import java.math.*;
class GFG
{
static int largestSubsequences(int arr[],
int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and count
// zeros and ones
for (int i = 0; i < n; i++)
if (arr[i] == 1)
countone++;
else
countzero++;
return Math.min(countone, countzero) * 2;
}
// Driver Code
public static void main(String args[])
{
int arr[] = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = arr.length;
System.out.println("largest Subsequences having " +
"equal number of 0 & 1 is " +
largestSubsequences(arr, n));
}
}
// This code is contributed by Nikita Tiwari
Python3
# Efficient Pyhton code to find
# length of the longest subsequence
# with equal number of 0s and 1s.
def largestSubsequence(arr,n):
# store count of zeros and one
countzero = 0
countone = 0
# traverse binary array and count
# zeros and ones
for i in range(n):
if arr[i]:
countone += 1
else:
countzero += 1
return min(countone, countzero) * 2
# Driver Code
arr = [ 1, 0, 0, 1, 0, 0, 0, 1 ]
n = len(arr)
print("largest Subsequences having" +
" equal number of 0 & 1 is ",
largestSubsequence(arr, n))
# This code is contributed
# by "Abhishek Sharma 44"
C#
// Efficient C# program to find
// length of the longest subsequence
// with equal number of 0s and 1s.
using System;
class GFG
{
static int largestSubsequences(int[] arr,
int n)
{
// store count of zeros and one
int countzero = 0, countone = 0;
// traverse binary array and
// count zeros and ones
for (int i = 0; i < n; i++)
if (arr[i] != 0)
countone++;
else
countzero++;
return Math.Min(countone,
countzero) * 2;
}
// Driver Code
static void Main()
{
int[] arr = { 1, 0, 0, 1, 0, 0, 0, 1 };
int n = 8 ;
Console.Write("largest Subsequences having" +
" equal number of 0 & 1 is " +
largestSubsequences(arr, n));
}
}
// This code is contributed by Anuj_67
PHP
Javascript
输出:
largest Subsequences having equal number of 0 & 1 is 6
时间复杂度: O(n)