您的位置:首页 > Web前端

剑指offer 33 把数组排成最小的数

2017-10-11 10:35 316 查看

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

思路

———–吐槽————

悲催!

上个房子的网打不开牛客,半个多月没刷剑指offer!

搬家了,终于可以开始了!

———–end————

最暴力的解法是找出数组所有组合情况,把所有组合情况最小的数字输出,时间复杂度O(n!)。

可以转化成排序问题。因为数组整体最小,取任意前一部分也是最小的,也就是从左到右依次递增排列,比较规则是ab

代码

# -*- coding: UTF-8 -*-
# -*- coding:utf-8 -*-
class Solution:
def partition(self, numbers, start, end):
tmp = numbers[start]
startindex = start
while start < end:
while start < end and (str(numbers[end]) + str(tmp)) >= (str(tmp) + str(numbers[end])):
end -= 1
while start < end and (str(numbers[start]) + str(tmp)) <= (str(tmp) + str(numbers[start])):
start += 1
if start < end:
numbers[start], numbers[end] = numbers[end], numbers[start]
# numbers[start] = tmp
numbers[start], numbers[startindex] = numbers[startindex], numbers[start]
return start
def qsort(self, numbers, start, end):
pivot = self.partition(numbers, start, end)
if start < pivot - 1:
self.qsort(numbers, start, pivot - 1)
if pivot + 1 < end:
self.qsort(numbers, pivot + 1, end)
def PrintMinNumber(self, numbers):
# write code here
if len(numbers) == 0:
return ''
self.qsort(numbers, 0, len(numbers) - 1)
res = ''
for tmp in numbers:
res += str(tmp)
return res
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: