- 博客(18)
- 收藏
- 关注
原创 【每日力扣】石子游戏下的贪心博弈
原始算法实现是通过循环找到每次的最大潜在博弈分数(a[i]+b[i]),然后根据玩家顺序累加得分,最后比较总分来决定结果,但时间复杂度为 O(n^2)。优化方案摒弃了原地寻找最大值的方法,转而使用排序技术。首先将 a 和 b 的和按照降序排列得到数组 c,然后计算 Alice 选择所有偶数索引元素获得的总潜在博弈分数与 Bob 所有可能获得的总分数之差以判断胜负。这个优化后的解决方案时间复杂度降低到了 O(nlogn),同时保留了原有逻辑下的最优策略判断。
2024-02-02 22:36:57 1020
原创 【每日力扣】最大交换(两种解法/自定义后序index函数)
这篇解题文章探讨了如何解决“最大交换”问题,给定一个非负整数,允许至多交换一次任意两位数字,目标是找到能得到的最大值。文章提供了两种解题思路:暴力解法和贪心算法。暴力解法通过两重循环尝试所有可能的交换,并找出其中的最大值,但这种方法效率较低。贪心算法则更为高效,其核心思想是将原数列转换为字符串后进行降序排序,然后比较排序后的序列与原序列,找到第一个不同的位置i,此时应将原序列中索引为i的数字与排序后序列中对应位置的数字进行交换,以实现高位数字的最大化。
2024-01-22 21:36:19 1032
原创 [每日力扣]——做菜顺序(前缀和的运用)
暑假过去了,又回到了学校,忙碌的事情很多,懒惰又战胜了刷题的决心,有一段时间没有刷题了,从今天开始要坚持每天一道题,战胜懒惰,激励自我!
2023-10-23 23:53:59 170 1
原创 【周赛总结】——数组的最大美丽值
看到这道题首先的想法就是用暴力解法,按顺序遍历数组里的每一个元素,并把他们所有可能的变换值都添加进一个新的列表里,最后找出列表中重复次数最多的那个元素的重复次数就可以了。数组的 子序列 定义是:经由原数组删除一些元素(也可能不删除)得到的一个新数组,且在此过程中剩余元素的顺序不发生改变。- 选择下标 1 ,将其替换为 4(从范围 [4,8] 中选出),此时 nums = [4,4,1,2]。- 选择下标 3 ,将其替换为 4(从范围 [0,4] 中选出),此时 nums = [4,4,1,4]。
2023-07-17 21:01:08 622 1
原创 n数之和问题——“排序+双指针”大法
其实可以发现,所谓的“排序+双指针”大法其实就是通过引入双指针的方法来代表其中的两个数,这样避免了多层循环产生浪费,提高了效率。双指针确实是个非常实在且好用的方法,值得我们大家好好琢磨钻研,掌握并且熟练运用。
2023-07-15 20:05:36 149 1
原创 【每日力扣】——交替数字和(python中+号的详解)
给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号:最高有效位 上的数字分配到 正 号。剩余每位上数字的符号都与其相邻数字相反。返回所有数字及其对应符号的和。示例 1:输入:n = 521输出:4解释:(+5) + (-2) + (+1) = 4示例 2:输入:n = 111输出:1解释:(+1) + (-1) + (+1) = 1示例 3:输入:n = 886996输出:0解释:(+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0这是一道
2023-07-12 09:55:09 258 1
原创 【力扣精选】——N字形变换(三种解法)
首先观察规律可以发现每一行的数据是具有周期性的,周期就是2*(行数-1),并且可以发现除首尾两行外每一行的数都是同行前一个数+周期-所在行数(首尾两行没有中间多出来的斜区域数)。至此所有数的表达式我们都已经知道了,一行一行地把它们都连接成串就解决了。这个解法是写完之后在题解里看到的大佬的解法,这个flag的使用简直惊为天人!这样子非常丝滑地遍历完字符串就解决了问题,根本不用像上面两种解法一样花那么大的力气在找规律上,太优雅了!直到我在讨论区看到了另一位大佬的详细图解,这才茅塞顿开。
2023-07-10 23:16:43 580 1
原创 【周赛总结】——最大跳跃次数(动态规划的运用)
可以看到在这个例子中,0就是一个大大的陷阱,一旦跳跃到0,就再也无法跳跃到末尾了!但是根据我的代码,由于我的跳跃过程是以1为步长进行检索的,所以如果碰到这样的陷阱,我是一跳一个准的!但是怎样能够避免掉进陷阱呢?此时我的思维已经完全跑偏,胡乱思考,浪费了很多时间,最后写出来的程序也很差劲。
2023-07-10 12:03:04 134 1
原创 【每日力扣】——两数之和 II - 输入有序数组(双指针的运用)
如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length。想到了运用双指针的知识,左右指针分别初始化为0和len(numbers)-1,一头一尾检索对应的两数和是否等于目标,因为数组是有序数组,所以可以通过得到的和与目标进行大小比较来决定左右指针的移动,如果小于目标,则左指针需要右移,反之右指针左移。输入:numbers = [2,7,11,15], target = 9。
2023-07-08 09:47:56 50
原创 【每日力扣】——拆分成最多数目的正偶数之和(贪心算法)
比方说,给你 finalSum = 12 ,那么这些拆分是 符合要求 的(互不相同的正偶数且和为 finalSum):(2 + 10) ,(2 + 4 + 6) 和 (4 + 8)。解释:以下是一些符合要求的拆分:(2 + 26),(6 + 8 + 2 + 12) 和 (4 + 24)。(6 + 8 + 2 + 12) 有最多数目的整数,数目为 4 ,所以我们返回 [6,8,2,12]。解释:以下是一些符合要求的拆分:(2 + 10),(2 + 4 + 6) 和 (4 + 8)。
2023-07-06 09:07:23 192 1
原创 【每日力扣】——最优除法
分子最大就是nums[0],因为数组里的数字都是正整数,所以最大的情况其实就是nums[0]单独做分子的时候,接下来就是简单的字符串处理的过程啦。解释: 1000/(100/10/2) = 1000/((100/10)/2) = 200。因为他们并不影响操作的优先级,所以你需要返回 "1000/(100/10/2)"。例如,nums = [2,3,4],我们将求表达式的值 "2/3/4"。但是,以下加粗的括号 "1000/((100/10)/2)" 是冗余的,输出: "1000/(100/10/2)"
2023-07-05 18:48:57 205
原创 【每日力扣】——K 件物品的最大和(贪心算法的运用)两种解法
后来我还想到了一种解法,题目做的无非是一个选k次数字的这么一个过程,那么我先构建一个列表,里面按1、0、-1的顺序储存所有的数字不就行了,这样我只要按照顺序从列表里选取k次就行了,根本无须讨论k的范围。解释:袋子中的物品分别标记为 {1, 1, 1, 0, 0}。取 3 件标记为 1 的物品,1 件标记为 0 的物品,得到的数字之和为 3。解释:袋子中的物品分别标记为 {1, 1, 1, 0, 0}。取 2 件标记为 1 的物品,得到的数字之和为 2。numNegOnes 件标记为 -1 的物品。
2023-07-05 12:15:28 113
原创 [典型例题]——无重复字符的最长子串(滑动窗口的运用)
这道题想到了滑动窗口的知识,通过双指针来检索窗口内是否有重复的字符,每一次循环结束时比较得到的无重复子串长length,取新一轮得到的length与旧的length中更大的,最后返回length。(一开始我没有用到左指针,而是新建了一个空列表a,通过append和pop方法来进行子串长度的修改,增加了时间复杂度,但是更容易我理解,因为我对双指针运用得还不太熟练。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
2023-07-04 18:25:15 80
原创 [每日力扣]——矩阵中的和
解释:第一步操作中,我们删除 7 ,6 ,6 和 3 ,将分数增加 7。下一步操作中,删除 2 ,4 ,5 和 2 ,将分数增加 5。最后删除 1 ,2 ,3 和 1 ,将分数增加 3。分析题目以及示例可知,这道题的实质就是选每行最大的值相加的到最后的分数,因此只需要对行排序后取出每列的最大值相加即可。矩阵中每一行选取最大的一个数,并删除它。输入:nums = [[7,2,1],[6,4,2],[6,5,3],[3,2,1]]在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 分数 中。
2023-07-04 16:15:40 126
原创 【错题理解】列表切片操作易错点
最开始由于不熟练导致 b=a[0:y+1] 这句写成了逗号,也就是 b=a[0,y+1] ,结果报错:list indices must be integers or slices, not tuple,翻译过来就是:列表索引必须是整数(取某一个数据,例如:data[0])或者片(取某一片数据,例如data[0:2]),不能是元组。其实错误的写法b=a[0,y+1] 就相当于b=a[:,y+1],意思就是读取列表a 的第y+2列,第y+2 列根本就不存在!
2023-07-03 19:23:32 85
原创 【错题理解】——python实现找100以内的质数 (for-else组合的使用)
看起来好像没什么问题,思路非常简单粗暴,首先创建一个空列表 a,排除1,所以 i 从2到100迭代 i 循环内部又嵌套一个从2到 i 迭代的 j 循环,若 i 对 j 取余等于0(即 i 可被 j 整除),那么则直接用break打断循环,反之则 i 为质数,使用append方法将 i 添加进列表,最后输出列表a。原来与c语言的if-else搭配不同,python中的else还有另外3种使用场景,分别是for - else、while - else 以及 try - except - else。
2023-07-02 23:15:39 2038 1
原创 Python常用列表相关操作整理
对原列表进行排序(默认从小到大,若想要从大到小,可以利用reverse语句也可以利用(list,sort(reverse=ture)))从原列表中检索待删除的元素a并删除,若原列表中无元素a则报错。删除列表中的某个(些)元素或直接删除列表的整个变量。从原列表中“弹”出a索引值位置上的元素并把它删除。返回元素a在列表中第一次出现位置的索引值。统计并返回元素a在原列表中出现的次数。在原列表的固定位置插入一个新的元素。在原列表的末端插入一个新的列表。在原列表中“切”出新的列表。待删除的元素a的索引值。
2023-07-02 18:59:50 254 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人