< s.size(); i++) {if(i + 1 < s.size() && heap[s[i]] < heap[s[i + 1]]) res -= heap[s[i]];else res += heap[s[i]];}return res;}};
14. 最长公共前缀
思想
通过暴力做法:第一层循环遍历每一位 , 第二层循环遍历i位置的每一个字符串是否相等
class Solution {public:string longestCommonPrefix(vector>& strs) {string res;if(strs.empty()) return res;for(int i = 0; i < strs[0].size(); i++) {char c = strs[0][i];for(auto stri : strs) {if(i > stri.size() || c != stri[i]) return res;}res += c;}return res;}};
启发:增强for循环这里第二层循环就很好用 , 可以快速取出strs中的每一个字符串
15. 三数之和
思想
这题目和后面一些题目都是类似的方法 , 都会用到双指针算法 , 而双指针算法需要明确的第一件事——数组是有序的 。因为这个题目里面一共有三个变量 , 定义 i,j,k三个指针 , 没有三指针算法 , 所以需要先固定一个指针i , 默认三个指针大小顺序是 i < j < k , 可以减少一部分重复 , 固定了i指针 , j从i后面开始遍历 , k从尾部倒序遍历 , 目标是找出满足 nums[i] + nums[j] + nums[k] >= 0 的最小的k , 这样能够简化时间复杂度的运用是排完序以后 , 如果j增加 , 那么k一定只能往左走 , 因为nums[i]是固定的 。
重复的问题怎么解决?从i入手 , 每一次先判断i位置的数值和上个是否相同 , 相同就跳过 。
class Solution {public:vector
16. 最接近的三数之和
思想
这题和上面的题目解法是类似的 , 并且这个问题最后只需要返回结果数值 , 所以可以省去去重的过程 , 但是需要注意的一个问题是最终结果可能是nums[i] + nums[j] + nums[k] (大于)或者nums[i] + nums[j] + nums[k - 1](小于)
class Solution {public:int threeSumClosest(vector
17. 电话号码的字母组合
思想
需要找出所有的排序方式 , 这个问题是典型的DFS暴搜问题 , 这里我们先来回顾一下DFS知识点 。DFS中比较重要的两个概念是回溯和剪枝 。
例题:给定一个整数n , 将数字1~n排成一排 , 请你按照字典序将所有的排列方法输出 。这就是一个最经典的DFS问题 , 思考DFS问题我们首先需要画出搜索树 , 这样能够帮助我们理解DFS过程 , DFS就是从第一个位置开始一直往下搜索知道没有路可以走 , 再回溯 。
- leetcode:2021.12.19周赛 变成递增数列的最少操作次数
- 200道大数据面试常考Leetcode算法题
- 绝对领域、究极力量,这部游戏改编的漫画当年火遍大街小巷 世界之最漫画
- 为什么都要柑果球,究极日月里柑果球还是只能获得一个吗
- 究极日月究极之洞神兽 究极日月究极之洞
- 口袋妖怪究极绿宝石臭臭花怎么进化?
- 火影忍者究极忍者风暴3完全爆发 火影忍者:究极忍者风暴3完全爆发
- 究极绿宝石5谁可以学潮旋
- 火影忍者究极风暴4电脑能双人吗 火影忍者究极风暴4电脑可以双人对战吗
- 究极绿宝石坚果哑铃多少级进化