随笔分类 - leetcode / leetcode高频题
摘要:题目链接 解题思路:保证一个有效区,当发现一个「新数」时,就扩大有效区。 怎么判断是否是一个新数?来到一个i位置,往左边看,如果相等,则i++,一直到不想等为止。为什么可以这样?因为是有序的。 代码 class Solution { public: int removeDuplicates(vect
阅读全文
摘要:题目链接 解题思路:每次从全局的拿一个最小值出来,每个链表的「头」,都是最小的,所以,我们可以使用一个小根堆(优先级队列),存放每个链表当前的「头」,然后弹出一个全局最小的节点出来,然后把该节点的next放回小根堆,供之后使用。 注意,压入小根堆时,要保证不为nullptr。 代码 /** * De
阅读全文
摘要:题目链接 解题思路:从左往右生成,生成的过程中,保证右括号不能比左括号多。 代码 class Solution { public: // 总共有n个括号对,left_res就是左括号还能使用的数目,right_res就是右括号还能使用的数目 // 要保证左括号大于等于右括号数目,即left_res
阅读全文
摘要:题目链接 解题思路:括号匹配问题,优先想到栈。 代码 class Solution { public: bool isValid(string s) { stack<char> st; for (auto &ch : s) { // 如果是右括号,那么必须得有一个相匹配的左括号 if (ch ==
阅读全文
摘要:题目链接 解题思路:可以定义一个node节点,然后一个cur节点,node节点先走n-1步,然后cur和node同时走,如果node->next == null了,那么cur就是被删除的节点,此时,我们用pre节点指向cur的前一个节点(node和cur在走的时候,pre也跟着走),就可以删除cur
阅读全文
摘要:题目链接 解题思路:一个简单的回溯题目。 代码 class Solution { public: map<char, string> table{ {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7',
阅读全文
摘要:题目链接 解题思路:没啥可说的,按照要求一个个字符处理 代码 class Solution { public: int romanToInt(string s) { int ans = 0; int len = s.length(); map<char, int> table{ {'I', 1},
阅读全文
摘要:题目链接 解题思路:整数转罗马数字,可以理解为一个一个「数」,有一个转换表,从高位依次往低位「数」,直接看代码更清晰 代码 class Solution { public: string intToRoman(int num) { // 转换表 vector<pair<int, string>> t
阅读全文
摘要:题目链接 解题思路:用第一个字符串的每个字符,逐个比较其他字符串,注意别越界就行 代码 class Solution { public: string longestCommonPrefix(vector<string>& strs) { string ans = ""; int len = str
阅读全文
摘要:题目链接 解题思路:先写一个暴力递归,bool process(s, p, i, j),s[i...]与p[j...]能否匹配成功?,i之前,以及j之前的都已经匹配成功了。 1️⃣p[j + 1] != '*' 若p[j] == '.',则递归调用process(s, p, i + 1, j + 1
阅读全文
摘要:题目链接 解题思路:拆分问题,三数之和,我们可以固定一个数字,就变成了两数之和了。还有一个难点就是,如何去重? 1️⃣先排序。 2️⃣固定第一个数,「第一个数」必须是之前没有求过的答案。 3️⃣从剩下的数中,求两数之和,求的过程中,直接去重。 两数之和,因为是有序了,所以直接双指针 细节看代码 代码
阅读全文
摘要:题目链接 解题思路:最长回文子串问题,首先要将原字符串扩充,比如abba,暴力是以每个字符s[i],左右两边扩,如果是abba,得不到最优解,扩充成#a#b#b#a#,就不会有问题,最优解是manacher算法。 假设s[i]扩充的区域是[x, y],是目前便利到的,最远的距离,我们称i为回文中心C
阅读全文
摘要:题目链接 解题思路:最长子串问题,考虑,以i开头的结果如何,以i结尾的结果如何,最终结果必定在其中。本题使用以i开头的结果如何,我们求出所有的「以i开头的最长子串」,再求出最长的即可。 求「以i开头的最长子串」,最简单的暴力即可,那么怎么加速呢? 我们在求「以i-1开头的最长子长串时」,假设结果是[
阅读全文
摘要:题目链接 思路 链表的方式,模拟加法的计算过程,用一个变量保存进位信息即可。 代码 class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { // 有一种办法可以节省空间,直接将结果放在l1或者l2上
阅读全文
摘要:题目链接 注意事项 1️⃣有且仅有一个正确答案。 2️⃣每个数只能使用一次。 3️⃣返回的是下标 解法一:两个for循环,找到了直接返回即可。 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { i
阅读全文