数组排列

本文介绍了一种优雅的算法,用于从整数数组中找出能够组成最大数值的排列方式。通过定义新的比较规则ab>ba来排序数组元素,进而获得最大组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数数组,求该数组的一个排列使得排列之后的数最大:

比如[1,3,22,9]=>93221

这个问题看似简单,但是要优雅的解决却并不容易.我只找到了dfs的办法进行计算,每次找到首位数最大的一个数字集合,然后枚举其中一个作为当前的位置的元素,然后递归的搜索下去。但是这样的复杂度是很高的。我们来看一下另外一个优雅的解法:

a>bab>ba,然后排序之后的结果即为答案!

WoooooooooooooooCao!简单不简单?但是确实不容易想到。这个的正确性是比较显然的,而且还是一个全序关系。选择a为最大,ab>ba,ac>ca,ad>da….,那么,显然我们无论如何排序,a都应该放在第一个.

注意这里用到了比较排序,所以不能用list实现,必须自己定义一个class并且定义lt属性。

ret = ''
def find_max_combination(L):
    class data:
        def __init__(self,x):
            self.x = x
        def __lt__(self,other):
            return int(self.x+other.x) < int(other.x+self.x)
    L2 = [data(x) for x in L]
    L2.sort(reverse=True)
    return int(''.join( x.x for x in L2))
#x = find_max_combination(['13','92','94','87','9','135','824','764','727'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值