贪心算法-删除数字问题

文章介绍了如何运用贪心算法解决给定数字串中删除k个数字以最大化剩余整数的问题。关键步骤包括理解贪心算法的概念,划分子问题,以及在删除数字时优先选择较小的数字。编程任务要求实现一个算法来找到最优解。
摘要由CSDN通过智能技术生成

任务描述\n

本关任务:掌握贪心算法的算法思想,并能利用贪心算法的算法思想解决删除数字问题。\n\n

给定n个纯数字组成的数字串,删除其中k(k\u003Cn)个数字后,剩下的数字按原来的秩序组成一个新的正整数,确定删除方案,使得剩下的数字组成的新的正整数最大。\n\n

相关知识\n

为了完成本关任务,你需要掌握:1.贪心算法的基本概念,2.贪心算法的基本思路步骤,3.删除数字问题求解思路。\n\n

贪心算法的基本概念\n

贪心算法又称之为贪婪算法,指的是在求解问题时,总是选择当前最好结果的方案,而不从整体考虑最优解法。贪心算法的两个基本要素分别是贪心选择和最优子结构。\n\n

贪心选择:求解问题的整体最优解可以通过一系列的局部最优的选择来实现,即贪心选择。\n

最优子结构:一个问题的最优解包含其子问题的最优解,称此问题具备最优子结构性质。\n

贪心算法的基本概念如下:\n\n

贪心算法是一种着眼局部的简单而适应范围有限的优化策略。\n

贪心算法在求解最优化问题时,从初始阶段开始,每一个阶段总是做一个使局部最优的贪心选择,不断把将问题转化为规模更小的子问题。也就是说贪心算法并不从整体最优考虑,每一阶段所做出的选择只是着眼于局部最优的选择。这样处理,对有些问题来说也能得到最优解,但也并不总是这样。\n贪心选择性质:所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是一问题可用贪心算法求解的前提,也是贪心算法与动态规划算法的主要区别。\n对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终能达到问题的整体最优。\n\n

贪心算法的基本思路步骤\n

根据贪心算法的基本概念,可以得到贪心算法的基本模型和执行步骤如下:\n\n

建立数学模型来描述问题;\n

把待求解的问题分成若干个子问题;\n

对每个子问题进行求解,得到子问题的局部最优解;\n

把子问题的局部最优解组合成原来问题的整体最优解。\n

删除数字问题求解思路\n

对于删除数字问题,第一次删除一个数字所得到的最大整数是当前的最优解,然后剩下的整数继续删除一个数字,得到的最大整数仍然是当前的最优解,以此类推,每次删除数字都选择得到当前最优解的策略。因此,最终删除k个数字后余下的最大整数即为整体的最优解。根据贪心算法的基本步骤,求解思路如下:\n\n

设大整数数组为a[0,1,…,n−1],每个数组元素表示大整数的一位,大整数的最高位为a[0],最低位为a[n−1],用赋值为−1来表示删除操作,例如a[1]=−1,则表示删除数组索引1处的数字;\n\n

求解n个纯数字组成的数字串删除k个数字后余下最大整数的问题,可以划分为k个子问题:删除1位数字后余下最大整数问题。\n\n

依次对每个子问题求解:从左往右查询(i=0→n−2),对于数组a中出现的第一个数据对a[i]\u003Ca[i+1],删除a[i]后余下的整数一定比删除a[i+1]后余下的整数要大(其余数字位置不变,相连两个数字中,删除小的数字a[i]后余下的整数a[0,1,…i−1,i+1,i+2,…n−1]一定比删除大的数字a[i+1]余下的整数a[0,1,…,i−1,i,i+2,…n−1]要大,因为新的整数在第i个位置上的数字前者大于后者)。为了实现方便,而不需要数组移位来形成新的整数,按先前的设定,将a[i]赋值为−1,往后的子问题在求解时注意跳过值为−1的数字。\n\n

k个子问题依次求解出最优解之后,得到的整数即为n个数字串删除k个数字后余下的最大整数。\n\n

上面第3步在求解k个子问题时用的是暴力尝试的方法,复杂度为O(k∗n),为了提高算法执行效率,可以维护每个子问题求解后i的位置,而不是每次都从头开始,这样子的算法复杂度为O(n+k),具体维护方法是:当a[i]=−1时,让i往左移(i=i−1),直到i=0或a[i]!=−1为止。\n

根据规律我们可以发现,每次删除的数字都是升序的第一个数字\n\n

编程要求\n

本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下:\n\n

在main中,读取大整数字符串并存入字符数组s,然后将字符数组s转换到整型数组a中。读取整数k(表示要删除k个数字),然后根据贪心策略,求解出删除k个数字后剩下的最大整数,并在一行输出。\n

测试说明\n

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。\n\n

以下是平台的测试样例:\n\n

测试输入:\n

79502867154829179316\n

8\n

预期输出:\n987829179316

 

 

头哥(Hutool)是一个Java工具包,它包含了一系列方便开发者使用的工具类,但"头哥第1关:Elasticsearch基本概念"这个表述可能并不准确。Elasticsearch是一个开源的分布式搜索引擎,它主要用于全文搜索和分析。如果你是指Hutool教程或某个特定的入门任务中关于Elasticsearch的内容,我可以为你概述几个基本概念: 1. **文档**(Document): 在Elasticsearch中,数据的基本单元是文档,它类似于关系数据库中的行。每个文档都有一个唯一的ID,并存储在一个索引(Index)里。 2. **索引**(Index): 是Elasticsearch中用于存储文档的容器,类似数据库表。你可以根据需要创建多个索引,每个索引可以包含相关的文档。 3. **字段**(Field): 文档中的每个属性都是一个字段,可以设置为各种数据类型,如字符串、数字、日期等。字段还可以进行分析处理,以便于搜索。 4. **查询**(Query): 用户通过查询来检索数据,Elasticsearch支持多种查询类型,如简单匹配、复杂查询(如布尔查询、范围查询)和聚合查询。 5. **索引操作**:常见的操作包括创建索引、添加文档(index)、更新文档(update)和删除文档(delete)。 6. **分片和复制**(Sharding and Replication): Elasticsearch将索引分成多个小的、独立的部分(分片),并可以在多个节点上复制这些分片,以提高数据的可用性和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值