📌  相关文章
📜  最小化使 Array 的每个元素等于它的索引值所需的操作

📅  最后修改于: 2021-09-07 02:53:40             🧑  作者: Mango

给定一个由N 个整数组成的数组arr[] ,任务是修改数组,使得arr[index] = index使用以下类型的最少操作次数:

  1. 选择任何索引i和任何整数X ,并将X添加到[0, i]范围内的所有元素。
  2. 选择任何索引i和任何整数X ,并将arr[j]更改为arr[j] % X ,其中0 ≤ j ≤ i

对于执行的每个操作,打印以下内容:

  • 第一次操作:打印1 i X
  • 对于第二个操作:打印2 i X

注意:最多可以应用N + 1 次操作。

例子:

方法:这个问题可以使用贪心方法来解决。以下是步骤:

  1. 应用类型 1 的N 个操作,其中第i操作是通过以相反的顺序遍历数组将X = ( N + i – (arr[i] % N) ) 添加到索引i 。对于每个i操作,打印“1 i X”
  2. 在上述N 次操作之后,数组的形式将是arr[i] % N = i for 0 ≤ i < N
  3. 还必须完成一项操作,即对每个数组元素与N求模,即操作“2 (N-1) N”
  4. 执行上述操作后,对于每个索引iarr[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