题目
把数组排成最小的数
一、思路 快排
最简单暴力的想法就是把这个数组的所有排列组合全部列出来,然后看是那一种组合的数值最小。
但是如果能有更好的方法呢?
有两个数字,a和b,ab > ba,则证明b比a小。
例如:
3, 21 321 > 213,则在我们最终想要的结果来看21是比3小的。
能否定义一种新的比较大小的规则。这样就能套用任意种排序方法,将这个数组做一个排序,然后将排序后的字符串组合在一起,一定是这个最小值。
该方法的具体论证请参照剑指offer原书。
如下方法实现了快排:
def min_umber(arr):
if not arr:
return 0
quickSort(arr, 0, len(arr))
return ''.join([str(x) for x in arr])
def partition(arr, low, high):
p = str(arr[low])
i = low + 1
for j in range(low, high):
# 重新定义一个比较的方式
a = int(str(arr[j]) + p)
b = int(p + str(arr[j]))
if a < b:
arr[i], arr[j] = arr[j], arr[i]
i += 1
arr[i-1], arr[low] = arr[low], arr[i-1]
return i
def quickSort(arr, low, high):
if low < high:
index = partition(arr, low, high)
quickSort(arr, low, index-1)
quickSort(arr, index, high)
print(min_umber([3, 33, 4, 21]))