题目
输入一个正整数数组,每个元素都不相等,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如数组{3,32,321},则打印出这3个数字能排成的最小数字321323.(《剑指Offer》P177)
贪心算法的题目,找到解决办法不能,难得是给出正确性证明。书中给出了证明,前半段讲的很好,不过后半段不是很满意。
解题思路
1)将数组中所有数字转化为字符串,组成新的数组Str
2)对所有字符串排序。 return Str[i]+Str[j]<Str[j]+Str[i]
源码
1 | public static class MinStringComparator implements Comparator { |
正确性证明
排序关系有效性证明
一个有效的比较规则一定满足自反性、对称性和传递性。
1)自反性:显然有 aa = aa,所以a等于a。
2)传递性:如果a小于b,则ab
3)传递性:假设a小于b,ab<ba. b小于c,bc<cb
a的十进制为m位,b的十进制为n位,c的十进制为k位
因此 a小于b,b小于c,a必定小于c
最终证明
排序关系证明是很重要的前提。正面证明很困难,使用反证法。
1 | 假设存在一个序列A小于序列B。 |