
获得徽章 8
- #刷题交流# 打卡第22天,小C来到了一家饭馆,这里共有n 道菜,第i 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第i 道菜是否含有蘑菇。如果 s_i = '1',那么第i 道菜含有蘑菇,否则没有。小C希望点k 道菜,且希望总价格尽可能低。由于她不喜欢蘑菇,她希望所点的菜中最多只有m 道菜含有蘑菇。小C想知道在满足条件的情况下能选出的最小总价格是多少。如果无法按照要求选择菜品,则输出-1。解题思路:将菜品根据是否含蘑菇分为两组:一组是含蘑菇的菜品,另一组是不含蘑菇的菜品。
分别对这两组菜品按照价格进行升序排序。
优先从不含蘑菇的菜品中选择,直到选满k道或没有更多的不含蘑菇的菜品可选。
如果还需要选择更多菜品以达到k道,则从含蘑菇的菜品中选择,但要确保不超过m道。
如果在以上过程中无法选到k道菜品,则返回-1。展开等人赞过75 - #刷题交流# 打卡第21天,算法的种类繁多,按照不同的分类标准,可以将算法划分为多种类型。以下是一些常见的算法分类:基本算法:这类算法是计算机科学中最基础、最常用的算法,如排序算法(冒泡排序、选择排序、快速排序、堆排序等)、查找算法等。数据结构算法:这类算法与数据结构的操作密切相关,如链表的插入、删除、遍历,二叉树的搜索、插入、删除等。几何算法:用于解决几何问题的算法,如计算图形的面积、周长,判断点是否在图形内,以及图形的变换、裁剪等。图论算法:专门用于处理图结构数据的算法,如图的遍历、最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Prim算法、Kruskal算法)、最大流算法等。规划算法:用于解决规划、调度等问题的算法,如旅行商问题(TSP)的求解算法、车辆路径问题等。数值分析算法:用于数值计算的算法,如线性方程组的求解、数值积分、常微分方程数值解法等。加密/解密算法:用于数据加密和解密的算法,如RSA算法、AES算法、DES算法等。并行算法:设计用于在并行计算环境中执行的算法,以提高计算效率,如并行排序、并行矩阵乘法等。数论算法:基于数论原理设计的算法,如大数运算、素数检测、模运算等。
此外,还有一些特殊的算法分类,如:
确定性算法:这类算法在有限的时间内完成计算,得到的结果是唯一的,且经常取决于输入值。非确定性算法:这类算法在有限的时间内完成,但是得到的结果不是唯一的,存在多值性。分治算法:将问题分解为若干个独立的子问题,最终将子问题的解集成为原问题的解。这种算法通常用于解决可以分解为多个相似子问题的问题,如快速排序、归并排序等。贪心算法:采取当前最优的选择,从而使最终结果尽可能接近最优解。动态规划算法:将问题分解为若干个子问题,并存储子问题的解以避免重复计算。回溯算法:在解决问题中,从可能的解中选择一个,如果发现并不是最优解,就放弃刚才的解,再从未搜索的选项中重新选择一条新的路径进行搜索。展开等人赞过25 - #刷题交流# 打卡第20天,小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。保证歌曲中的id两两不同。解题思路:为了实现小R的特殊随机播放规则,我们需要模拟这个过程。首先播放列表中的第一首歌,并将其移除,然后将新的第一首歌移到列表末尾,重复这个过程直到列表为空。我们可以使用一个队列来模拟这个过程,因为队列具有先进先出(FIFO)的特点,这正好符合题目中描述的操作:从列表的前端取歌曲并播放,然后如果列表不为空,将新的第一个元素移动到列表的末尾。展开评论点赞
- #刷题交流# 打卡第19天,小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?解题思路:需要计算每个字符在字符串中出现的次数。然后,对于每个字符,如果它出现了超过一次,我们就需要执行删除操作来减少它的出现次数到1或者完全移除它。每次删除两个相同的字符后,我们可以添加任意一个小写字母,但这个新添加的字母不会影响我们使所有字母不相同的最终目标,因为我们可以在每一步都选择一个当前不在字符串中的字母添加。具体来说,如果我们有一个字符出现了n次(n > 1),那么为了使得该字符只出现一次,我们需要进行(n-1)/2次操作(因为每次操作可以删除两个字符)。如果n是奇数,我们会剩下1个字符;如果是偶数,则会正好全部删除。但是由于题目要求最少的操作次数,所以我们应该尽量保留一个字符而不是完全删除。展开评论点赞
- #刷题交流# 打卡第18天,问题描述小S最近在分析一个数组 N h1,h2,...,h N,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 k 个相邻元素时,如何计算它们所能形成的最大矩形面积。对于 k 个相邻的元素,我们定义其矩形的最大面积为:R(k)=k×min(h[i],h[i+1],...,h[i+k−1])即,R(k) 的值为这 k 个相邻元素中的最小值乘以 k。现在,小S希望你能帮他找出对于任意 k,R(k) 的最大值。解题思路:可以使用一个单调栈来帮助我们高效地找到对于每个高度h[i]作为最小值时的最大矩形面积。具体来说,我们要找到每个元素左右两边第一个小于该元素的位置,从而确定以该元素为最小值的最宽矩形。展开评论点赞
- #刷题交流# 打卡第17天,问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。解题思路:首先计算起始位置 x_position 和目标位置 y_position 的差值的绝对值 diff,这个差值就是需要移动覆盖的距离。然后通过一个 while 循环去寻找合适的最大步长 n。根据题目移动规则,整个移动过程可以类比成一个先递增步长然后再递减步长的过程(类似等差数列),利用等差数列求和公式 n * (n + 1) / 2 来判断当前假设的最大步长 n 对应的移动距离总和是否能够覆盖需要移动的距离 diff。只要总和小于 diff,就不断增加 n 的值。最后,不管计算出来的总和是刚好等于 diff 还是略大于 diff,按照题目要求要达到最少步数且首末步长为 1 的情况,所需要的最少步数就是这个最终确定的 n。展开评论点赞 - #刷题交流# 打卡第15天,小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。解题思路:为了找出两个倒排链的交集,并按照从大到小的顺序返回结果,我们可以使用双指针方法。由于两个列表都是有序的(从小到大),我们可以从两个列表的末尾开始比较,这样就能直接获得从大到小排序的结果。展开评论点赞