📌  相关文章
📜  使数组的所有元素相等的最小步骤数

📅  最后修改于: 2021-09-02 06:30:52             🧑  作者: Mango

给定两个长度相同的数组A[]B[] ,任务是通过用数组 B 中相应元素的差异替换元素来找到使数组中的所有元素相等所需的最少步数。
注意:如果这是不可能的,则打印 -1。
例子:

方法:思路是找到数组元素可以收敛的值,这个值肯定会在0到数组的最小值之间。下面是该方法的说明:

  • 最初,将标志标记为 False,以检查数组是否可转换。
  • 运行 while 循环,直到数组的最小值大于 -1。
    • 迭代数组的索引,即从 0 到 length – 1
    • 对于每个索引,检查数组 A 中该索引处的元素是否大于数组的最小值,如果是,则将数组元素 A[i] 更新为 A[i] – B[i]。
    • 将步数增加 1。
    • 如果是,检查所有数组元素是否相等,然后将标志标记为 True 并中断 while 循环
    • 否则,重复上述步骤以计算所需的总步数。
  • 最后,检查标志是否为 True,如果是,则数组是可转换的。

举例说明:
给定数组是 – A[] = {5, 7, 10, 5, 15}, B[] = {2, 2, 1, 3, 5}

Array A Current Index Minimum of Array A Steps Comments
{5, 7, 10, 5, 15} 0 5 0 No operation !
{5, 5, 10, 5, 15} 1 5 1 Array element is subtracted once. 7 – 2 = 5
{5, 5, 9, 5, 15} 2 5 2 Array element is subtracted once. 10 – 1 = 9
{5, 5, 8, 5, 15} 2 5 3 Array element is subtracted once. 9 – 1 = 8
{5, 5, 7, 5, 15} 2 5 4 Array element is subtracted once. 8 – 1 = 7
{5, 5, 6, 5, 15} 2 5 5 Array element is subtracted once. 7 – 1 = 6
{5, 5, 5, 5, 15} 2 5 6 Array element is subtracted once. 6 – 1 = 5
{5, 5, 5, 5, 10} 4 5 7 Array element is subtracted once. 15 – 5 = 10
{5, 5, 5, 5, 5} 4 5 8 Array element is subtracted once. 10 – 5 = 5

下面是上述方法的实现:

C++
// C++ implementation to find the
// minimum number of steps to convert
// array by subtracting the corresponding
// element from array B
#include 
using namespace std;
  
// Function to find the minimum steps
void minimumSteps(int ar1[], int ar2[], int n)
{
     
    // Counter to store the steps
    int ans = 0;
      
    // Flag to check that
    // array is converted
    bool flag = true;
      
    // Loop until the minimum of the
    // array is greater than -1
    while (*min_element(ar1, ar1 + n) > -1)
    {
        int a = *min_element(ar1, ar1 + n);
         
        // Loop to convert the array
        // elements by substraction
        for(int i = 0; i < n; i++)
        {
            if (ar1[i] != a)
            {
                ar1[i] -= ar2[i];
                ans += 1;
            }
        }
         
        set s1(ar1, ar1 + n);
         
        // If the array is converted
        if (s1.size() == 1)
        {
            flag = false;
            cout << ans << endl;
            break;
        }
    }
     
    if (flag)
    {
        cout << -1 << endl;
    }
}
         
// Driver Code
int main()
{
    int n = 5;
    int ar1[] = { 5, 7, 10, 5, 15 };
    int ar2[] = { 1, 2, 1, 5, 5 };
      
    // Function call
    minimumSteps(ar1, ar2, n);
  
    return 0;
}
 
// This code is contributed by rutvik_56


Java
// Java implementation to find the
// minimum number of steps to convert
// array by subtracting the corresponding
// element from array B
import java.util.*;
class GFG{
  
// Function to find the
// minimum steps
static void minimumSteps(int ar1[],
                         int ar2[],
                         int n)
{
  // Counter to store the steps
  int ans = 0;
 
  // Flag to check that
  // array is converted
  boolean flag = true;
 
  // Loop until the minimum of the
  // array is greater than -1
  while (Arrays.stream(ar1).min().getAsInt() > -1)
  {
    int a = Arrays.stream(ar1).min().getAsInt();
 
    // Loop to convert the array
    // elements by substraction
    for(int i = 0; i < n; i++)
    {
      if (ar1[i] != a)
      {
        ar1[i] -= ar2[i];
        ans += 1;
      }
    }
 
    HashSet s1 = new HashSet<>();
    for(int i = 0; i < n; i++)
    {
      s1.add(ar1[i]);
    }
 
    // If the array is converted
    if (s1.size() == 1)
    {
      flag = false;
      System.out.print(ans + "\n");
      break;
    }
  }
 
  if (flag)
  {
    System.out.print(-1 + "\n");
  }
}
         
// Driver Code
public static void main(String[] args)
{
  int n = 5;
  int ar1[] = {5, 7, 10, 5, 15};
  int ar2[] = {1, 2, 1, 5, 5};
 
  // Function call
  minimumSteps(ar1, ar2, n);
}
}
 
// This code is contributed by Princi Singh


Python3
# Python3 implementation to find the
# minimum number of steps to convert
# array by subtracting the corresponding
# element from array B
 
# Function to find the minimum steps
def minimumSteps(ar1, ar2, n):
     
    # Counter to store the steps
    ans = 0
     
    # Flag to check that
    # array is converted
    flag = True
     
    # Loop until the minimum of the
    # array is greater than -1
    while min(ar1)>-1:
        a = min(ar1)
         
        # Loop to convert the array
        # elements by substraction
        for i in range(n):
            if ar1[i]!= a:
                ar1[i]-= ar2[i]
                ans+= 1
                 
        # If the array is converted
        if len(set(ar1))== 1:
            flag = False
            print(ans)
            break
    if flag:
        print(-1)
 
# Driver Code
if __name__ == "__main__":
    n = 5
    ar1 = [5, 7, 10, 5, 15]
    ar2 = [1, 2, 1, 5, 5]
     
    # Function Call
    minimumSteps(ar1, ar2, n)


C#
// C# implementation to
// find the minimum number
// of steps to convert array
// by subtracting the
// corresponding element from
// array B
using System;
using System.Linq;
using System.Collections.Generic;
class GFG{
  
// Function to find the
// minimum steps
static void minimumSteps(int []ar1,
                         int []ar2,
                         int n)
{
  // Counter to store the steps
  int ans = 0;
 
  // Flag to check that
  // array is converted
  bool flag = true;
 
  // Loop until the minimum of the
  // array is greater than -1
  while (ar1.Min() > -1)
  {
    int a = ar1.Min();
 
    // Loop to convert the array
    // elements by substraction
    for(int i = 0; i < n; i++)
    {
      if (ar1[i] != a)
      {
        ar1[i] -= ar2[i];
        ans += 1;
      }
    }
 
    HashSet s1 = new HashSet();
     
    for(int i = 0; i < n; i++)
    {
      s1.Add(ar1[i]);
    }
 
    // If the array is converted
    if (s1.Count == 1)
    {
      flag = false;
      Console.Write(ans + "\n");
      break;
    }
  }
 
  if (flag)
  {
    Console.Write(-1 + "\n");
  }
}
         
// Driver Code
public static void Main(String[] args)
{
  int n = 5;
  int []ar1 = {5, 7, 10, 5, 15};
  int []ar2 = {1, 2, 1, 5, 5};
 
  // Function call
  minimumSteps(ar1, ar2, n);
}
}
 
// This code is contributed by 29AjayKumar


输出:
8





性能分析:

  • 时间复杂度:与上述方法一样,有两个循环来转换在最坏情况下需要 O(N 2 ) 的数组,因此时间复杂度将为O(N 2 )
  • 空间复杂度:与上述方法一样,没有使用额外的空间,因此空间复杂度为O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live