剑指offer实践 ——45.把数组排成最小的数(python版)



题目

把数组排成最小的数
在这里插入图片描述


一、思路 快排

最简单暴力的想法就是把这个数组的所有排列组合全部列出来,然后看是那一种组合的数值最小。
但是如果能有更好的方法呢?
有两个数字,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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值