对于使用贪心算法的一个比较经典的问题,主要是为了解决最大整数的拼接问题,如果给定一个列表,这个列表中所包括的是一些非负整数,如果对这些整数进行组合,怎样才能组合出一个最大的整数,这里要注意一个问题,有可能整数过大会导致出现溢出的现象,所以返回的数据可以是一个字符类型,这样就可以防止溢出。
添加图片注释,不超过 140 字(可选)
对如上的一个给定列表中的数据进行排列,这里如果考虑将本身值较大的放在前面的话,就不会得到拼接后较大的值,因为12112并没有12121数值大,所以正确的解决问题的思路是通过拼接两个字符,对比确定那个位于前面的时候才能够得到较大的整数。
添加图片注释,不超过 140 字(可选)
再例如,如果给定的另外一个列表如上图,就在决定两个元素如何拼接时,不能简单通过两个元素大小进行判断,将两个元素不同拼接方式所组成的数字的大小进行拼接后对比,这里使用的是双层循环,对数组中的遍历,每两个元素进行组合,每次循环分别确定最终拼接的第1位一直到最后一位,然后将元素按照顺序拼接起来返回即可。
添加图片注释,不超过 140 字(可选)
双层循环遍历数组中两两元素的组合方式,每次循环确定一个位置的元素,经过排序这个列表中元素的顺序得到最终结果,这里要注意一个特殊情况,当列表中元素均为0时,最终返回的结果是多个0,这里要将其转换一个元素0。使用python实现的代码如下:
def largestNumber(nums):
nums=[str(i) for i in nums]
for i in range(len(nums)-1):
for j in range(i+1,len(nums)):
if int(nums[i]+nums[j])<int(nums[j]+nums[i]):
temp=nums[i]
nums[i]=nums[j]
nums[j]=temp
if int(''.join(nums))==0:
return str(0)
else:
return ''.join(nums)
对如上的一个代码还可以进行优化:
from functools import cmp_to_key
def largestNumber(nums):
nums=[str(i) for i in nums]
nums.sort(key=cmp_to_key(lambda x,y:int(y+x)-int(x+y)))
if int(''.join(nums))==0:
return '0'
else:
return ''.join(nums)