Check if all array elements can be converted to K using given operations

Last Updated : 19 Jul, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an integer array arr of size N and an integer K, the task is to make all elements of the array equal to K using the following operations: 
 

  • Choose an arbitrary subarray [l....r] of the input array
  • Replace all values of this subarray equal to the [((r - l) + 2) / 2]th value in sorted subarray [l...r]


Examples: 
 

Input: arr [ ] = {5, 4, 3, 1, 2, 6, 7, 8, 9, 10}, K = 3 
Output: YES 
Explanation: 
Choose first five elements and replace all elements with 3: arr = {3, 3, 3, 3, 3, 6, 7, 8, 9, 10} 
Now take forth to sixth elements and replace all elements with 3: arr = {3, 3, 3, 3, 3, 3, 7, 8, 9, 10} 
By applying same operations we can make all elements of arr equal to K: arr = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3}
Input: arr [ ] = {3, 1, 2, 3}, K = 4 
Output: NO 
 


 


Approach: 
 

  • We can observe that it is possible to make all elements of the array equal to K only if following two conditions are satisfied: 
    1. There must be at least one element equal to K.
    2. There must exist a continuous triplet such that any two values of that triplet is greater than or equal to K.
  • To solve this problem, we need to create an auxiliary array, say aux[] , that contains three values 0, 1, 2.
  • The final task is to check if it is possible to make all elements of aux array equal to 1. If two out of three continuous elements in aux[] are greater than 0, then we can take a subarray of size 3 and make all elements of that subarray equal to 1. And then we expand this logic through the entire array.


Below is the implementation of above approach: 
 

C++
// C++ implementation of above approach

#include <bits/stdc++.h>
using namespace std;

// Function that prints
// whether is to possible
// to make all elements
// of the array equal to K
void makeAllK(int a[], int k, int n)
{
    vector<int> aux;

    bool one_found = false;

    // Fill vector aux
    // according to the
    // above approach
    for (int i = 0; i < n; i++) {

        if (a[i] < k)
            aux.push_back(0);

        else if (a[i] == k) {
            aux.push_back(1);
            one_found = true;
        }

        else
            aux.push_back(2);
    }

    // Condition if K
    // does not exist in
    // the given array
    if (one_found == false) {
        cout << "NO"
             << "\n";
        return;
    }

    bool ans = false;

    if (n == 1
        && aux[0] == 1)
        ans = true;

    if (n == 2
        && aux[0] > 0
        && aux[1] > 1)
        ans = true;

    for (int i = 0; i < n - 2; i++) {

        // Condition for minimum
        // two elements is
        // greater than 0 in
        // pair of three elements
        if (aux[i] > 0
            && aux[i + 1] > 0) {

            ans = true;
            break;
        }

        else if (aux[i] > 0
                 && aux[i + 2] > 0) {
            ans = true;
            break;
        }

        else if (aux[i + 2] > 0
                 && aux[i + 1] > 0) {
            ans = true;
            break;
        }
    }

    if (ans == true)
        cout << "YES"
             << "\n";
    else
        cout << "NO"
             << "\n";
}

// Driver Code
int main()
{
    int arr[]
        = { 1, 2, 3,
            4, 5, 6,
            7, 8, 9, 10 };

    int K = 3;

    int size = sizeof(arr)
               / sizeof(arr[0]);

    makeAllK(arr, K, size);

    return 0;
}
Java
// Java implementation of the above approach
import java.util.*;

class GFG{

// Function that prints
// whether is to possible
// to make all elements
// of the array equal to K
static void makeAllK(int a[], int k, int n)
{
    Vector<Integer> aux = new Vector<Integer>();

    boolean one_found = false;

    // Fill vector aux according 
    // to the above approach
    for(int i = 0; i < n; i++)
    {
       if (a[i] < k)
           aux.add(0);
       
       else if (a[i] == k) 
       {
           aux.add(1);
           one_found = true;
       }
       else
           aux.add(2);
    }

    // Condition if K does not  
    // exist in the given array
    if (one_found == false)
    {
        System.out.print("NO" + "\n");
        return;
    }

    boolean ans = false;

    if (n == 1 && aux.get(0) == 1)
        ans = true;

    if (n == 2 && aux.get(0) > 0 && 
                  aux.get(1) > 1)
        ans = true;

    for(int i = 0; i < n - 2; i++)
    {
       
       // Condition for minimum
       // two elements is
       // greater than 0 in
       // pair of three elements
       if (aux.get(i) > 0 && 
           aux.get(i + 1) > 0)
       {
           ans = true;
           break;
       }
       else if (aux.get(i) > 0 &&
                aux.get(i + 2) > 0) 
       {
           ans = true;
           break;
       }
       else if (aux.get(i + 2) > 0 && 
                aux.get(i + 1) > 0)
       {
           ans = true;
           break;
       }
    }

    if (ans == true)
        System.out.print("YES" + "\n");
    else
        System.out.print("NO" + "\n");
}

// Driver Code
public static void main(String[] args)
{
    int arr[] = { 1, 2, 3, 4, 5,
                  6, 7, 8, 9, 10 };
    int K = 3;
    int size = arr.length;

    makeAllK(arr, K, size);

}
}

// This code is contributed by amal kumar choubey
Python3
# Python3 implementation of above approach

# Function that prints whether is
# to possible to make all elements
# of the array equal to K
def makeAllK(a, k, n):
    
    aux = []
    one_found = False

    # Fill vector aux according
    # to the above approach
    for i in range(n):
        if (a[i] < k):
            aux.append(0)

        elif (a[i] == k):
            aux.append(1)
            one_found = True

        else:
            aux.append(2)

    # Condition if K does 
    # not exist in the given
    # array
    if (one_found == False):
        print("NO")
        return

    ans = False

    if (n == 1 and aux[0] == 1):
        ans = True

    if (n == 2 and aux[0] > 0 and aux[1] > 1):
        ans = True

    for i in range(n - 2):
        
        # Condition for minimum two 
        # elements is greater than 
        # 0 in pair of three elements
        if (aux[i] > 0 and aux[i + 1] > 0):
            ans = True
            break

        elif (aux[i] > 0 and aux[i + 2] > 0):
            ans = True
            break

        elif (aux[i + 2] > 0 and aux[i + 1] > 0):
            ans = True
            break

    if (ans == True):
        print("YES")
    else:
        print("NO")

# Driver Code
if __name__ == '__main__':
    
    arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
    K = 3
    size = len(arr)

    makeAllK(arr, K, size)

# This code is contributed by Surendra_Gangwar
C#
// C# implementation of the above approach
using System;
using System.Collections.Generic;

class GFG{

// Function that prints
// whether is to possible
// to make all elements
// of the array equal to K
static void makeAllK(int []a, int k, int n)
{
    List<int> aux = new List<int>();

    bool one_found = false;

    // Fill vector aux according 
    // to the above approach
    for(int i = 0; i < n; i++)
    {
       if (a[i] < k)
       {
           aux.Add(0);
       }
       else if (a[i] == k) 
       {
           aux.Add(1);
           one_found = true;
       }
       else
           aux.Add(2);
    }

    // Condition if K does not 
    // exist in the given array
    if (one_found == false)
    {
        Console.Write("NO" + "\n");
        return;
    }

    bool ans = false;
    if (n == 1 && aux[0] == 1)
        ans = true;

    if (n == 2 && aux[0] > 0 && 
                  aux[1] > 1)
        ans = true;

    for(int i = 0; i < n - 2; i++)
    {
       
       // Condition for minimum
       // two elements is
       // greater than 0 in
       // pair of three elements
       if (aux[i] > 0 && 
           aux[i + 1] > 0)
       {
           ans = true;
           break;
       }
       else if (aux[i] > 0 && 
                aux[i + 2] > 0) 
       {
           ans = true;
           break;
       }
       else if (aux[i + 2] > 0 && 
                aux[i + 1] > 0)
       {
           ans = true;
           break;
       }
    }
    if (ans == true)
        Console.Write("YES" + "\n");
    else
        Console.Write("NO" + "\n");
}

// Driver Code
public static void Main(String[] args)
{
    int []arr = { 1, 2, 3, 4, 5,
                  6, 7, 8, 9, 10 };
    int K = 3;
    int size = arr.Length;

    makeAllK(arr, K, size);
}
}

// This code is contributed by amal kumar choubey
JavaScript
<script>

// Javascript implementation of above approach

// Function that prints
// whether is to possible
// to make all elements
// of the array equal to K
function makeAllK(a, k, n)
{
    var aux = [];

    var one_found = false;

    // Fill vector aux
    // according to the
    // above approach
    for (var i = 0; i < n; i++) {

        if (a[i] < k)
            aux.push(0);

        else if (a[i] == k) {
            aux.push(1);
            one_found = true;
        }

        else
            aux.push(2);
    }

    // Condition if K
    // does not exist in
    // the given array
    if (one_found == false) {
        document.write( "NO" + "<br>");
        return;
    }

    var ans = false;

    if (n == 1
        && aux[0] == 1)
        ans = true;

    if (n == 2
        && aux[0] > 0
        && aux[1] > 1)
        ans = true;

    for (var i = 0; i < n - 2; i++) {

        // Condition for minimum
        // two elements is
        // greater than 0 in
        // pair of three elements
        if (aux[i] > 0
            && aux[i + 1] > 0) {

            ans = true;
            break;
        }

        else if (aux[i] > 0
                 && aux[i + 2] > 0) {
            ans = true;
            break;
        }

        else if (aux[i + 2] > 0
                 && aux[i + 1] > 0) {
            ans = true;
            break;
        }
    }

    if (ans == true)
        document.write( "YES"+ "<br>")
    else
        document.write( "NO"+ "<br>")
}

// Driver Code
var arr
    = [1, 2, 3,
        4, 5, 6,
        7, 8, 9, 10];
var K = 3;
var size = arr.length;
makeAllK(arr, K, size);

// This code is contributed by rutvik_56.
</script>

Output: 
YES

 

Time Complexity: O(N) 
Auxiliary Space: O(N)
 


Next Article
Article Tags :
Practice Tags :

Similar Reads