Minimize operations required to make each element of Array equal to it’s index value
Last Updated :
19 May, 2021
Given an array arr[] consisting of N integers, the task is to modify the array such that arr[index] = index using minimum number of operations of the following type:
- Choose any index i and any integer X, and add X to all the elements in the range [0, i].
- Choose any index i and any integer X, and change arr[j] to arr[j] % X where 0 ? j ? i.
For each operation performed, print the following:
- For 1st operation: print 1 i X
- For 2nd operation: print 2 i X
Note: Maximum N + 1 operations can be applied.
Examples:
Input: arr[] = {7, 6, 3}, N = 3
Output:
1 2 5
1 1 2
1 0 1
2 2 3
Explanation:
1st operation: Adding 5 to all the elements till index 2 modifies array to {12, 11, 8}.
2nd operation: Adding 2 to all the elements till index 1 modifies array to {14, 13, 8}.
3rd operation: Adding 1 to all the elements till index 0 modifies array to {15, 13, 8}.
4th operation: Adding 3 to all the elements till index 2 modifies array to {0, 1, 2}.
So after 4 operations, the required array is obtained.
Input: arr[] = {3, 4, 5, 6}, N = 4
Output:
1 3 5
1 2 4
1 1 4
1 0 4
2 3 4
Approach: This problem can be solved using Greedy Approach. Below are the steps:
- Apply N operations of type 1 where the ith operation is to add X = ( N + i – (arr[i] % N) ) upto index i by traversing the array in the reverse order. For every ith operation, print “1 i X”.
- After the above N operations array will be of the form arr[i] % N = i for 0 ? i < N.
- One more operation has to be done which is to perform modulo of each array element with N i.e., the operation “2 (N-1) N”.
- After performing the above operations, for each index i, arr[i] = i.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void makeIncreasing( int arr[], int N)
{
for ( int x = N - 1; x >= 0; x--)
{
int val = arr[x];
int add = N - val % N + x;
cout << "1 " << x << " " << add << endl;
for ( int y = x; y >= 0; y--) {
arr[y] += add;
}
}
int mod = N;
cout << "2 " << N - 1 << " " << mod << endl;
for ( int x = N - 1; x >= 0; x--) {
arr[x] %= mod;
}
}
int main()
{
int arr[] = { 7, 6, 3 };
int N = sizeof (arr) / sizeof (arr[0]);
makeIncreasing(arr, N);
}
|
Java
import java.util.*;
class GFG
{
static void makeIncreasing( int arr[], int N)
{
for ( int x = N - 1 ; x >= 0 ; x--)
{
int val = arr[x];
int add = N - val % N + x;
System.out.println( "1"
+ " " + x + " " + add);
for ( int y = x; y >= 0 ; y--)
{
arr[y] += add;
}
}
int mod = N;
System.out.println( "2"
+ " " + (N - 1 ) + " " + mod);
for ( int x = N - 1 ; x >= 0 ; x--)
{
arr[x] %= mod;
}
}
public static void main(String[] args)
{
int arr[] = { 7 , 6 , 3 };
int N = arr.length;
makeIncreasing(arr, N);
}
}
|
Python3
def makeIncreasing(arr, N):
for x in range ( N - 1 , - 1 , - 1 ):
val = arr[x]
add = N - val % N + x
print ( "1" + " " + str (x) + " " + str (add))
for y in range (x, - 1 , - 1 ):
arr[y] + = add
mod = N;
print ( "2" + " " + str (N - 1 ) + " " + str (mod))
for i in range ( N - 1 , - 1 , - 1 ):
arr[i] = arr[i] % mod
arr = [ 7 , 6 , 3 ]
N = len (arr)
makeIncreasing(arr, N)
|
C#
using System;
class GFG
{
static void makeIncreasing( int [] arr, int N)
{
for ( int x = N - 1; x >= 0; x--)
{
int val = arr[x];
int add = N - val % N + x;
Console.WriteLine( "1"
+ " " + x + " " + add);
for ( int y = x; y >= 0; y--)
{
arr[y] += add;
}
}
int mod = N;
Console.WriteLine( "2"
+ " " + (N - 1) + " " + mod);
for ( int x = N - 1; x >= 0; x--) {
arr[x] %= mod;
}
}
public static void Main()
{
int [] arr = new int [] { 7, 6, 3 };
int N = arr.Length;
makeIncreasing(arr, N);
}
}
|
Javascript
<script>
function makeIncreasing(arr, N)
{
for ( var x = N - 1; x >= 0; x--) {
var val = arr[x];
var add = N - (val % N) + x;
document.write( "1" + " " + x + " "
+ add + "<br>" );
for ( var y = x; y >= 0; y--) {
arr[y] += add;
}
}
var mod = N;
document.write( "2" + " " + (N - 1) + " "
+ mod + "<br>" );
for ( var x = N - 1; x >= 0; x--) {
arr[x] %= mod;
}
}
var arr = [7, 6, 3];
var N = arr.length;
makeIncreasing(arr, N);
</script>
|
Output
1 2 5
1 1 2
1 0 1
2 2 3
Time Complexity: O(N2)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...