python使用贪心算法求最大整数问题

这篇具有很好参考价值的文章主要介绍了python使用贪心算法求最大整数问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于使用贪心算法的一个比较经典的问题,主要是为了解决最大整数的拼接问题,如果给定一个列表,这个列表中所包括的是一些非负整数,如果对这些整数进行组合,怎样才能组合出一个最大的整数,这里要注意一个问题,有可能整数过大会导致出现溢出的现象,所以返回的数据可以是一个字符类型,这样就可以防止溢出。

python使用贪心算法求最大整数问题,python,贪心算法,开发语言

添加图片注释,不超过 140 字(可选)

对如上的一个给定列表中的数据进行排列,这里如果考虑将本身值较大的放在前面的话,就不会得到拼接后较大的值,因为12112并没有12121数值大,所以正确的解决问题的思路是通过拼接两个字符,对比确定那个位于前面的时候才能够得到较大的整数。

python使用贪心算法求最大整数问题,python,贪心算法,开发语言

添加图片注释,不超过 140 字(可选)

再例如,如果给定的另外一个列表如上图,就在决定两个元素如何拼接时,不能简单通过两个元素大小进行判断,将两个元素不同拼接方式所组成的数字的大小进行拼接后对比,这里使用的是双层循环,对数组中的遍历,每两个元素进行组合,每次循环分别确定最终拼接的第1位一直到最后一位,然后将元素按照顺序拼接起来返回即可。

python使用贪心算法求最大整数问题,python,贪心算法,开发语言

添加图片注释,不超过 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)

对如上的一个代码还可以进行优化:文章来源地址https://www.toymoban.com/news/detail-805069.html

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)

到了这里,关于python使用贪心算法求最大整数问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 贪心算法|53.最大子序和

    力扣题目链接 这题的暴力解法很好理解,以上是贪心解法的代码。 贪心解法 贪心贪的是哪里呢? 如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方! 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重

    2024年04月09日
    浏览(46)
  • 【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

    双指针 C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 贪心算法 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作: 从数组中选择一个下标 i ,将 nums[i] 增加 或者 减少 1 。 最终数组的频率分数定义为数组

    2024年02月04日
    浏览(68)
  • 最大子段和问题算法设计(C语言)

    编译环境:Dev-C++ 分别用暴力枚举,优化枚举,递归分治和动态规划的方法解决最大字段和问题。 给定n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子序列和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。 用一个三重循环,i和j从

    2023年04月09日
    浏览(36)
  • C++ 求最大子序列和(贪心算法)

    #include \\\"iostream\\\" #include \\\"vector\\\" using namespace std; class Solution { // 得到一个最大的负数 int isAllLow(vectorint nums){ int max=nums[0]; for (int i = 1; i nums.size(); ++i) { if(maxnums[i]){ max=nums[i]; } } return max; } public: // 求最大子序列 int maxSubArray(vectorint nums) { int sum=0; int maxsum=this-isAllLow(nums); // 如果是一个

    2024年02月07日
    浏览(42)
  • 【C语言】两个整数最大公约数和最小公倍数

    输入两个整数,求这两个数的最大公约数和最小公倍数。 第一种求法(辗转相除法)这个方法代码较洁简,我也比较推荐就是刚开始有点比较难了解。 首先,来看看怎么求最大公约数,求最大公约数需要用到 欧几里得算法 ,也称为辗转相除法。算法就是用两数中较大的数

    2024年02月04日
    浏览(49)
  • 贪心算法求数组中能组成三角形的最大周长

    题目:三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形,返回`0。 分析: 对数组排序,再从大到小选择三个数, 再判断是否能构成三角形,可以直接返回三数之

    2024年02月12日
    浏览(46)
  • 算法 贪心1 || 455.分发饼干 376. 摆动序列 53. 最大子数组和

    什么是贪心:贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 但是贪心没有套路,做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。 很容易想到,把孩子的胃口和饼干大小都排序,都从最小值开始遍历。如果最小的饼干无法满足最

    2023年04月16日
    浏览(49)
  • DAY36:贪心算法(三)最大子数组和+买卖股票最佳时机

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 10^5 -10^4 = nums[i] = 10^4 枚举思路 本题的暴力解法就是两个for循环,一个for循环遍

    2024年02月12日
    浏览(54)
  • K 次取反后最大化的数组和【贪心算法】

    1005 . K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 关于 nums = IntStream.of(nums

    2024年02月11日
    浏览(47)
  • 算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

    Hello,大家好,我是星恒 呜呜呜,今天给大家带来的又是一道经典的动归难题。 题目:leetcode 410 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k_ 个非空的连续子数组。 设计一个算法使得这 k _个子数组各自和的最大值最小。 示例: 示例 1: 示例 2: 示例

    2024年01月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包