【问题标题】:Equalize array by subtracting values from indexes通过从索引中减去值来均衡数组
【发布时间】:2022-01-29 03:57:55
【问题描述】:

我正在努力解决这个特殊问题,并且不太确定如何解决它,任何想法都会非常感激。

我有一个大小为 n 的数组,例如 3

[8, 10, 5]

我想从这个数组中减去值,直到所有索引都相等,使用尽可能少的减去值。 这个特定问题的答案是

8 10 5
8 8 3       Subtract 2 from index 1 and 2
3 3 3       Subtract 5 from index 0 and 1
[3, 3, 3]

要求: 数组不能移动(不能移动索引)
只允许减法
您只能减去两个彼此相邻的索引(例如,如果我想减少 index[1],我还必须减少 index[0] 或 index[2])
减去多个索引必须是相同的值(例如,将 index[1] 减去 3,我必须在 index[1] 旁边选择一个索引并将其减去相同的数量(3))

目标:通过尽可能少的减法使数组中的所有值相等。

感谢任何帮助,因为我完全不知道如何开始解决这个问题!

【问题讨论】:

  • 答案如何{3, 3, 3}。你采取了哪些步骤来得到这个答案?
  • 数组索引为 0, 1, 2。它们不会改变。我认为您的意思是 elements 变得相等。
  • 感谢您的反馈,我已经更新了我的问题。
  • 有许多输入数组根本不可能。有什么额外的限制吗?
  • 数组是否限制为 3 个元素?在您的问题中,您说明了大小 n。

标签: java arrays


【解决方案1】:

首先通过迭代数组找到最大值和最小值。 例如,在这个

array = {8,10,5}

最大值为 10,最小值为 5。

然后从最大值及其相邻值中减去差值 (5),并忽略不太相邻的值。(在这种情况下,10 的邻居是 8,5 -> 因此,从 8 中减去 5),然后

   arrays ={3,5,5} 

现在再次迭代数组并找到最大值和最小值(5,3) .从最大值和具有更多值的相邻邻居中减去差值( 5-3 =2 )(从 3,5 中减去 2 从 5 中) 那么你的数组就变成了

  arrays ={3,3,3} 

【讨论】:

  • 如果我可以问,你会为[4,6,4,4,6,4]做什么,因为最小的是[2,2,2,2,2,2]
  • 所以我认为你可以像[4 6 4 4 6 4] [2 4 4 4 6 4] [2 2 2 4 6 4] [2 2 2 2 4 4] [2 2 2 2 2 2] 那样做
【解决方案2】:

简单的解决方案:

static int equalizeArray(int N, int k, int arr[])
{

   long   steps=0;
   Arrays.sort(arr);
   int mid=0;
   if(N%2==1){
       mid=N/2;
   }
   else{
       mid=N/2-1;
   }
   for( int i=0;i<N;i++){

       if(  (Math.abs(arr[i]-arr[mid]))%k!=0){
           return -1;
       }
   }
   for( int i=0;i<N;i++){
   long   diff=Math.abs(arr[i]-arr[mid]);
       steps+=(diff/k)%1000000007;
   }
   return (int)steps%1000000007;
   
}

【讨论】:

  • 最佳情况复杂度:O(n) 最坏情况复杂度:O n long n
猜你喜欢
  • 2018-07-03
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多