给定N个不同的元件的阵列和多个缬氨酸,根据与val中的绝对差重新排列的数组元素,即,具有最小元素差至上等。同样,在两个或更多元素具有相同差异的情况下,应保持数组元素的顺序。
例子:
Input: val = 6, a = [7, 12, 2, 4, 8, 0]
Output: a = [7 4 8 2 12 0]
Explanation:
Consider the absolute difference of each array element and ‘val’
7 – 6 = 1
12- 6 = 6
2 – 6 = 4 (abs)
4 – 6 = 2 (abs)
8 – 6 = 2
0 – 6 = 6 (abs)
So, according to the obtained differences, sort the array differences in increasing order,
1, 2, 2, 4, 6, 6 is obtained, and their corresponding array elements are 7, 4, 8, 2, 12, 0.
Input: val = -2, a = [5, 2, 0, -4]
Output: a = [0 -4 2 5]
方法:通常, Python的字典只能保存一个与键对应的值。但是在这个问题中,我们可能必须为一个特定的键存储多个值。显然,不能使用简单的字典,我们需要像C++中的multimap这样的东西。因此,这里使用Default字典,它在Python用作Multimap。以下是解决问题的步骤。
- 将值存储在字典中,其中key是’val’和数组元素之间的绝对差(即abs(val-a [i])),而值是数组元素(即a [i])
- 在multiimap中,值已经按照关键字进行了排序,因为它在内部实现了self-balancing-binary-search-tree。
- 通过逐一存储字典元素来更新原始数组的值。
下面是上述方法的实现。
# Python program to sort the array
# according to a value val
# Using Default dictionary (works as Multimap in Python)
from collections import defaultdict
def rearrange(a, n, val):
# initialize Default dictionary
dict = defaultdict(list)
# Store values in dictionary (i.e. multimap) where,
# key: absolute difference between 'val'
# and array elements (i.e. abs(val-a[i])) and
# value: array elements (i.e. a[i])
for i in range(0, n):
dict[abs(val-a[i])].append(a[i])
index = 0
# Update the values of original array
# by storing the dictionary elements one by one
for i in dict:
pos = 0
while (pos
7 4 8 2 12 0
时间复杂度: O(N * Log N)
辅助空间: O(N)
替代方法:使用大小为n * 2的二维矩阵将绝对差和索引存储在(i,0)和(i,1)处。对二维矩阵进行排序。根据内置的矩阵属性,将根据第一个元素对矩阵进行排序,如果第一个元素相同,则将根据第二个元素对矩阵进行排序。获取索引并相应地打印数组元素。
下面是上述方法的实现。
def printsorted(a, n, val):
# declare a 2-D matrix
b =[[0 for x in range(2)] for y in range(n)]
for i in range(0, n):
b[i][0] = abs(a[i]-val)
b[i][1] = i
b.sort()
for i in range(0, n):
print a[b[i][1]],
a = [7, 12, 2, 4, 8, 0]
n = len(a)
val = 6
printsorted(a, n, val)
7 4 8 2 12 0
时间复杂度: O(N * Log N)
辅助空间: O(N)