随笔分类 - LeetCode
摘要:观察可知, 的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 的最后面。 /* * @lc app=leetcode.cn id=88 lang=java * * [
阅读全文
摘要:本方法需要对「Floyd 判圈算法」(又称龟兔赛跑算法)有所了解。 假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;如果该链表中有环,那么「兔子」会先于「乌龟」进入环,并
阅读全文
摘要:题目中要求找到所有「不重复」且和为 0 的三元组,这个「不重复」的要求使得我们无法简单地使用三重循环枚举所有的三元组。这是因为在最坏的情况下,数组中的元素全部为 0,即 [0, 0, 0, 0, 0, ..., 0, 0, 0] 任意一个三元组的和都为 0。如果我们直接使用三重循环枚举三元组,会得到
阅读全文
摘要:import java.util.ArrayDeque; import java.util.Deque; /* * @lc app=leetcode.cn id=239 lang=java * * [239] 滑动窗口最大值 */ // @lc code=start class Solution {
阅读全文
摘要:class Solution { public: vector<vector<int>> findContinuousSequence(int sum) { vector<vector<int>> ans; vector<int> res; int l = 1, r = 1, s = 1; whil
阅读全文
摘要:如果我们可以把所有数字分成两组,使得: 两个只出现一次的数字在不同的组中; 相同的数字会被分到相同的组中。 那么对两个组分别进行异或操作,即可得到答案的两个数字。这是解决这个问题的关键。 那么如何实现这样的分组呢? 记这两个只出现了一次的数字为 a 和 b,那么所有数字异或的结果就等于 a 和 b
阅读全文
摘要:自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。 如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。 /** * Definition for a bi
阅读全文
摘要:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), r
阅读全文
摘要:class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size() + 1; int l = 0, r = n - 1; while (l < r) { int mid = l + r >> 1; i
阅读全文
摘要:只有当链表 headA 和 headB 都不为空时,两个链表才可能相交。因此首先判断链表 headA 和 headB 是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回 null。 当链表 headA 和 headB 都不为空时,创建两个指针 pA 和 pB,初始时分别指向两个链表的头
阅读全文
摘要:class Solution { public: vector<int> temp; int res = 0; int reversePairs(vector<int>& nums) { int n = nums.size(); temp.resize(n); mergeSort(nums, 0,
阅读全文
摘要:方法一:使用哈希表存储频数 我们可以对字符串进行两次遍历。 在第一次遍历时,我们使用哈希映射统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回该字符,否则在遍历结束后返回空格。 class Solution { public: char firstUn
阅读全文
摘要:首先我们来通过一个例子理解一下这里「翻译」的过程:我们来尝试翻译「14021402」。 分成两种情况: 首先我们可以把每一位单独翻译,即 [1, 4, 0, 2],翻译的结果是 beac 然后我们考虑组合某些连续的两位: [14, 0, 2],翻译的结果是 oac。 [1, 40, 2],这种情况是
阅读全文
摘要:class Solution { public: static bool cmp(int& a, int& b) { string sa = to_string(a), sb = to_string(b); return sa + sb < sb + sa; } string minNumber(v
阅读全文
摘要:class Solution { public: int digitAtIndex(int n) { int digit = 1; int start = 0; long long cnt = 10; while (n >= cnt) { n -= cnt; digit++; if (start =
阅读全文
摘要:标准的中序遍历采用 左 → 根 → 右 的顺序,其中 左 和 右 的部分调用递归。 本题的处理在于将前一个结点与当前结点链接,因此,必须跟踪最后一个结点,该结点在新的双向链表中是当前最大的。 另外一个细节:我们也需要保留第一个,也就是最小的结点,以完成闭环。 下面是具体算法: 将 first 和 l
阅读全文
摘要:由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。 具体地,我们从指针 p 指向链表的哑节点,随后开始对链表进行遍历。如果当
阅读全文
摘要:由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。 具体地,我们从指针 cur 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur 与 cur.next 对应的元素相同,那么我们就将 cur.next 从链表中移除;否
阅读全文
摘要:法一 我们首先将该链表中每一个节点拆分为两个相连的节点,例如对于链表 ,我们可以将其拆分为 \(A \rightarrow A' \rightarrow B \rightarrow B' \rightarrow C \rightarr
阅读全文
摘要:对于给定的某个排列,我们想求出比它大的最小的排列。 可以从后往前遍历这个排列,找到第一个可以让排列的字典序变大的位置。 只有当序列单调下降时,它才不存在更大的排列,因此我们要找的位置就是第一-次出现 的位置。 那么此时将 变成比它大的最小数
阅读全文