最小化给定数组的 A[i] – (B + i) 的绝对值之和
给定一个大小为 N的数组arr[ ] ,任务是找到表达式abs(arr[1] – (b + 1)) + abs(arr[2] – (b + 2))的最小可能值。 . . abs(arr[N] – (b + N)) ,其中b是一个独立的整数。
Input: arr[ ] = { 2, 2, 3, 5, 5 }
Output: 2
Explanation: Considering b = 0: The value of the expression is abs(2 – (0 + 1)) + abs(2 – (0 + 2)) + abs(3 – (0 + 3)) + abs(5 – (0 + 4)) + abs(5 – (0 + 5)) = 1 + 0 + 0 + 1 + 0 = 2
Therefore, the minimum possible value for the expression is 2.
Input: arr[ ] = { 6, 5, 4, 3, 2, 1 }
Output: 18
方法:考虑B[i] = A[i] - i,问题是减少以最小化 abs (B[i] - b) 的总和。可以观察到,最好将b作为修改后的数组B[] 的中位数。因此,在对数组B[] 进行排序后,可以按照以下步骤解决问题。
- 遍历数组arr[ ]并按索引 (i + 1)减少每个元素。
- 按升序对数组进行排序。
- 现在,选择b作为arr[ ]的中位数,例如b = arr[N/2] 。
- 初始化一个变量,比如ans为0,以存储表达式的最小可能值。
- 再次遍历数组并将ans更新为abs(arr[i] – b)。
- 返回ans的值。
下面是上述方法的实现。
C++
Java
Python3
C#
Javascript
输出:
时间复杂度: O(N*logN)
辅助空间: O(1)