给定一个由N 个整数组成的数组arr[] ,任务是修改数组,使得arr[index] = index使用以下类型的最少操作次数:
- 选择任何索引i和任何整数X ,并将X添加到[0, i]范围内的所有元素。
- 选择任何索引i和任何整数X ,并将arr[j]更改为arr[j] % X ,其中0 ≤ j ≤ i 。
对于执行的每个操作,打印以下内容:
- 第一次操作:打印1 i X
- 对于第二个操作:打印2 i X
注意:最多可以应用N + 1 次操作。
例子:
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
方法:这个问题可以使用贪心方法来解决。以下是步骤:
- 应用类型 1 的N 个操作,其中第i个操作是通过以相反的顺序遍历数组将X = ( N + i – (arr[i] % N) ) 添加到索引i 。对于每个第i个操作,打印“1 i X” 。
- 在上述N 次操作之后,数组的形式将是arr[i] % N = i for 0 ≤ i < N 。
- 还必须完成一项操作,即对每个数组元素与N求模,即操作“2 (N-1) N” 。
- 执行上述操作后,对于每个索引i , arr[i] = i 。
下面是上述方法的实现:
C++
// CPP program for the above approach
#include
using namespace std;
// Function which makes the given
// array increasing using given
// operations
void makeIncreasing(int arr[], int N)
{
// The ith operation will be
// 1 i N + i - arr[i] % N
for (int x = N - 1; x >= 0; x--)
{
int val = arr[x];
// Find the value to be added
// in each operation
int add = N - val % N + x;
// Print the operation
cout << "1 " << x << " " << add << endl;
// Performing the operation
for (int y = x; y >= 0; y--) {
arr[y] += add;
}
}
// Last modulo with N operation
int mod = N;
cout << "2 " << N - 1 << " " << mod << endl;
for (int x = N - 1; x >= 0; x--) {
arr[x] %= mod;
}
}
// Driver Code
int main()
{
// Given array arr[]
int arr[] = { 7, 6, 3 };
int N = sizeof(arr) / sizeof(arr[0]);
// Function Call
makeIncreasing(arr, N);
}
Java
// Java Program for the above approach
import java.util.*;
class GFG
{
// Function which makes the given
// array increasing using given
// operations
static void makeIncreasing(int arr[], int N)
{
// The ith operation will be
// 1 i N + i - arr[i] % N
for (int x = N - 1; x >= 0; x--)
{
int val = arr[x];
// Find the value to be added
// in each operation
int add = N - val % N + x;
// Print the operation
System.out.println("1"
+ " " + x + " " + add);
// Performing the operation
for (int y = x; y >= 0; y--)
{
arr[y] += add;
}
}
// Last modulo with N operation
int mod = N;
System.out.println("2"
+ " " + (N - 1) + " " + mod);
for (int x = N - 1; x >= 0; x--)
{
arr[x] %= mod;
}
}
// Driver code
public static void main(String[] args)
{
// Given array arr[]
int arr[] = { 7, 6, 3 };
int N = arr.length;
// Function Call
makeIncreasing(arr, N);
}
}
Python3
# python Program for the above problem
# Function which makes the given
# array increasing using given
# operations
def makeIncreasing(arr, N):
# The ith operation will be
# 1 i N + i - arr[i] % N
for x in range( N - 1 , -1, -1):
val = arr[x]
# Find the value to be added
# in each operation
add = N - val % N + x
# Print the operation
print("1" + " " + str(x) + " " + str(add))
# Performing the operation
for y in range(x, -1, -1):
arr[y] += add
# Last modulo with N operation
mod = N;
print("2" + " " + str(N - 1) + " " + str(mod))
for i in range( N - 1, -1, -1):
arr[i] = arr[i] % mod
# Driver code
# Given array arr
arr = [ 7, 6, 3 ]
N = len(arr)
# Function Call
makeIncreasing(arr, N)
C#
// C# Program for the above approach
using System;
class GFG
{
// Function which makes the given
// array increasing using given
// operations
static void makeIncreasing(int[] arr, int N)
{
// The ith operation will be
// 1 i N + i - arr[i] % N
for (int x = N - 1; x >= 0; x--)
{
int val = arr[x];
// Find the value to be added
// in each operation
int add = N - val % N + x;
// Print the operation
Console.WriteLine("1"
+ " " + x + " " + add);
// Performing the operation
for (int y = x; y >= 0; y--)
{
arr[y] += add;
}
}
// Last modulo with N operation
int mod = N;
Console.WriteLine("2"
+ " " + (N - 1) + " " + mod);
for (int x = N - 1; x >= 0; x--) {
arr[x] %= mod;
}
}
// Driver code
public static void Main()
{
// Given array arr[]
int[] arr = new int[] { 7, 6, 3 };
int N = arr.Length;
// Function Call
makeIncreasing(arr, N);
}
}
Javascript
1 2 5
1 1 2
1 0 1
2 2 3
时间复杂度: O(N 2 )
辅助空间: O(1)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live