Given two arrays A[] and B[] of length N, the task is to check if both arrays can be made equal by performing the following operation at most K times:
- Choose any index i and either change Ai to the number of digits Ai have or change Bi to the number of digits Bi have.
Examples:
Input: N = 4, K = 1, A = [1, 2, 3, 4], B = [1, 2, 3, 5] Output: Unequal Explanation: It is impossible to make both the array equal by performing the following operation: 1st operation on A will change A to [1, 2, 3, 1] as number of digits in 4 is 1. So both the arrays are unequal .
Input: N = 3, K = 3, A = [2, 9, 3], B = [1, 100, 9]. Output: Equal Explanation: It is possible to make both the array equal by performing the following operations: 1st operation on A will change A to [1, 9, 3] as number of digits in 2 is 1. 2nd operation on B will change B to [1, 3, 9] as number of digits in 100 is 3. So array A is equal to array B after the operations.
Approach: To solve the problem follow the below idea/Intuition:
Can we make both array similar?
The answer is Yes as we are reducing each number by its length so eventually all numbers in both the array can be 1. The important thing here is to notice that every number greater than 1 always decreases by performing the operation. Thus, if a number appears in only one of the arrays, you will have to do one of the followings two things:
- Decrease some greater number to make it equal to this one.
- Decrease this number.
So, the proposed solution is the following. Consider the largest element in each array. If they are equal, remove both. If not, apply above operation to the larger of them and continue until the arrays are empty. This can be done efficiently using a max heap (priority queue).
Follow the below steps to solve the problem:
- Declare priority queue (max heap) ‘First’ and push all the elements of A[] on First.
- Declare priority queue (max heap) ‘Second’ and push all the elements of B[] on Second.
- Initialize the counter variable to 0.
- Start a while loop till any of the queues become empty and check.
- If (First.top() > Second.top()) then pop the top element from First and push the number of digits in that element back to First and increment the counter by 1.
- If (Second.top() > First.top()) then pop the top element from Second and push the number of digits in that element back to Second and increment the counter by 1.
- If ( first.top() = second.top() ) then pop the top elements from both heaps.
- After the iteration is over, If the counter is less than or equal to K, print “Equal“, otherwise, print “Unequal“
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int len( int x)
{
string temp = to_string(x);
return temp.size();
}
bool canbothEqual( int N, int K, vector< int >& A,
vector< int >& B)
{
priority_queue< int > First;
for ( int i = 0; i < N; i++) {
First.push(A[i]);
}
priority_queue< int > Second;
for ( int i = 0; i < N; i++) {
Second.push(B[i]);
}
int counter = 0;
while (!First.empty() && !Second.empty()) {
int num1 = First.top();
int num2 = Second.top();
if (num1 > num2) {
First.push(len(num1));
First.pop();
counter++;
}
else if (num2 > num1) {
Second.push(len(num2));
Second.pop();
counter++;
}
else {
First.pop();
Second.pop();
}
}
if (K >= counter)
return true ;
return false ;
}
int main()
{
int N = 3;
int K = 3;
vector< int > A = { 2, 9, 3 };
vector< int > B = { 1, 100, 9 };
if (canbothEqual(N, K, A, B))
cout << "Equal" ;
else
cout << "Unequal" ;
return 0;
}
|
Java
import java.util.*;
class GFG {
static int len( int x)
{
String temp = String.valueOf(x);
return temp.length();
}
static boolean canbothEqual( int N, int K, int [] A,
int [] B)
{
PriorityQueue<Integer> First = new PriorityQueue<>(
(x, y) -> Integer.compare(y, x));
for ( int i = 0 ; i < N; i++) {
First.add(A[i]);
}
PriorityQueue<Integer> Second = new PriorityQueue<>(
(x, y) -> Integer.compare(y, x));
for ( int i = 0 ; i < N; i++) {
Second.add(B[i]);
}
int counter = 0 ;
while (First.size() != 0 && Second.size() != 0 ) {
int num1 = First.peek();
int num2 = Second.peek();
if (num1 > num2) {
First.add(len(num1));
First.poll();
counter++;
}
else if (num2 > num1) {
Second.add(len(num2));
Second.poll();
counter++;
}
else {
First.poll();
Second.poll();
}
}
if (K >= counter)
return true ;
return false ;
}
public static void main(String[] args)
{
int N = 3 ;
int K = 3 ;
int [] A = { 2 , 9 , 3 };
int [] B = { 1 , 100 , 9 };
if (canbothEqual(N, K, A, B))
System.out.println( "Equal" );
else
System.out.println( "Unequal" );
}
}
|
Python3
from queue import PriorityQueue
def canbothEqual(N, K, A, B):
First = PriorityQueue()
for i in range (N):
First.put(A[i])
Second = PriorityQueue()
for i in range (N):
Second.put(B[i])
counter = 0
while (First.empty() = = False and Second.empty() = = False ):
num1 = First.get()
num2 = Second.get()
if (num1 > num2):
First.put( len ( str (num1)))
nn = First.get()
counter + = 1
elif (num2 > num1):
Second.put( len ( str (num2)))
cc = Second.get()
counter + = 1
else :
cc = First.get()
nn = Second.get()
if (K > = counter):
return True
return False
if __name__ = = "__main__" :
N = 3
K = 3
A = [ 2 , 9 , 3 ]
B = [ 1 , 100 , 9 ]
if (canbothEqual(N, K, A, B)):
print ( "Equal" )
else :
print ( "Unequal" )
|
C#
using System;
using System.Collections.Generic;
class Program {
static int len( int x)
{
string temp = x.ToString();
return temp.Length;
}
static bool canbothEqual( int N, int K, int [] A, int [] B)
{
List< int > First = new List< int >();
for ( int i = 0; i < N; i++) {
First.Add(A[i]);
}
List< int > Second = new List< int >();
for ( int i = 0; i < N; i++) {
Second.Add(B[i]);
}
int counter = 0;
while (First.Count != 0 && Second.Count != 0) {
First.Sort((a, b) => b.CompareTo(a));
Second.Sort((a, b) => b.CompareTo(a));
int num1 = First[0];
int num2 = Second[0];
if (num1 > num2) {
First.Add(len(num1));
First.RemoveAt(0);
counter++;
}
else if (num2 > num1) {
Second.Add(len(num2));
Second.RemoveAt(0);
counter++;
}
else {
First.RemoveAt(0);
Second.RemoveAt(0);
}
}
if (K >= counter)
return true ;
return false ;
}
static void Main( string [] args)
{
int N = 3;
int K = 3;
int [] A = { 2, 9, 3 };
int [] B = { 1, 100, 9 };
if (canbothEqual(N, K, A, B))
Console.WriteLine( "Equal" );
else
Console.WriteLine( "Unequal" );
}
}
|
Javascript
<script>
function PriorityQueue () {
this .collection = [];
this .printCollection = function () {
console.log( this .collection);
};
this .enqueue= function (item){
if ( this .collection.length===0) {
this .collection.push(item);
}
else if ( this .collection.length===1){
if (item[1]>= this .collection[0][1]){
this .collection.push(item);
}
else if (item[1]< this .collection[0][1]){
this .collection.unshift(item);
}
}
else if ( this .collection.length>1){
let check= false ;
for (let i=0;i< this .collection.length;i++){
if ( this .collection[i][1]>item[1]){
if (i===0){
check= true ;
this .collection.unshift(item);
break ;
}
else {
check= true ;
let sliced= this .collection.slice(0,i);
let slicedend= this .collection.slice(i, this .collection.length);
sliced.push(item);
this .collection=sliced.concat(slicedend);
break ;
}
}
}
if (!check){
this .collection.push(item);
}
};
this .dequeue = function (){
return this .collection.shift()[0];
};
this .size = function (){
return this .collection.length;
};
this .isEmpty= function (){
return this .collection.length===0? true : false ;
};
this .front= function (){
return this .collection[0];
};
}
}
function len(x)
{
let temp = String(x);
return temp.length;
}
function canbothEqual(N, K, A, B)
{
let First = new PriorityQueue();
for (let i = 0; i < N; i++) {
First.enqueue(A[i]);
}
let Second = new PriorityQueue();
for (let i = 0; i < N; i++) {
Second.enqueue(B[i]);
}
let counter = 0;
while (!First.isEmpty() && !Second.isEmpty()) {
let num1 = First.front();
let num2 = Second.front();
if (num1 > num2) {
First.enqueue(len(num1));
First.dequeue();
counter++;
}
else if (num2 > num1) {
Second.enqueue(len(num2));
Second.dequeue();
counter++;
}
else {
First.dequeue();
Second.dequeue();
}
}
if (K >= counter)
return true ;
return false ;
}
N = 3;
K = 3;
let A = [ 2, 9, 3 ];
let B = [ 1, 100, 9 ];
if (canbothEqual(N, K, A, B))
console.log( "Equal" );
else
console.log( "Unequal" );
</script>
|
Time Complexity: O(N * log(N)) Auxiliary Space: O(N)
|