随笔分类 - LeetCode
摘要:1044. Longest Duplicate Substring 本题的high level的思想是二分搜索这样的substring最多能有多长。对于一个固定的len,如果能在S里找到两处相同的子串滑窗,那么我们就可以对len的搜索往上调整;反之,我们就必须将len的搜索往下调。 于是本题转化为,
阅读全文
摘要:根据BST的前序遍历重建BST 1. 平均O(NlogN) 最坏O(N^2) class Solution { public: TreeNode* dfs(int l, int r, vector<int>& p) { if (l > r) return nullptr; TreeNode* nod
阅读全文
摘要:#include <iostream> #include <cmath> #include <cstdlib> #include <cstring> #include <climits> #include <algorithm> #include <numeric> #include <utilit
阅读全文
摘要:// c[u] == 0 表示从来没有访问过 (从来没有调用过dfs(u)) // c[u] == 1 表示已经访问过,并且还递归访问过它的所有子孙 (即dfs(u)曾经被调用过,并已经返回) // c[u] == -1 表示正在访问 (即递归调用dfs(u)正在栈中,尚未返回) int c[max
阅读全文
摘要:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。 无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如
阅读全文
摘要:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 分析:滑动窗口法,用一个map记录每个字符出现的位置索引,当该字符之前出现过且在当前窗口内,则窗口左端点要右移到该位置。 class Solution { public: int lengthOfLongestSubst
阅读全文
摘要:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 分析:归并排序,在归并的时候多加一行代码统计逆序对即可 class Solution { public: vector<int> a, t; int cnt = 0; voi
阅读全文
摘要:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。 分析:约瑟夫环问题,可以用循环链
阅读全文
摘要:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 题解:使用位运算 计算不进位的和 sum = a ^ b; 计算进位carry = a & b << 1; 重复上两步a = sum; b = carry; class Solution { publ
阅读全文
摘要:1. 二叉搜索树的最近公共祖先 判断当前节点的值和两节点的值的大小即可确定$LCA(p, q)$的位置: 如果p q的值都小于当前节点的值,则递归进入当前节点的左子树;如果p q的值都大于当前节点的值,则递归进入当前节点的右子树;如果当前节点的值在p q两个节点的值的中间,那么这两个节点的最近公共祖
阅读全文
摘要:注意各种特殊情况 class Solution { public: int strToInt(string s) { int res = 0; int i = 0; int flag = 1; // 检查空格 while (s[i] == ' ') i++; // 检查符号 if (s[i] ==
阅读全文
摘要:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 方法1:后序遍历二叉树,先判断子树是不是平衡树,如果不是,直接返回,此处利用了剪枝的思想 time: $O(n)$ space: $O(n)$ /** * Definit
阅读全文
摘要:输入两个链表,找出它们的第一个公共节点。 如果两个链表没有交点,返回 NULL 。 我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node
阅读全文
摘要:Given an integer array A, you partition the array into (contiguous) subarrays of length at most K. After partitioning, each subarray has their values
阅读全文
摘要:找出数组中最小的k个数。 排序 ,$nlog(n)$ 维持大小为k的最大堆,$nlog(k)$ 快排思想,期望时间复杂度 $O(n)$,最坏时间复杂度 $O(n^2)$,随机partition会改善最坏的情况 class Solution { public: int partition(vector
阅读全文
摘要:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 分析: class Solution { public: int majorityElement(vector<int>& nums) { int x = 0, votes =
阅读全文
摘要:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。 注意点: 中序遍历BST即为
阅读全文
摘要:把一个数组分成m个连续子数组(不能有空数组),求所有分法中,子数组sum的最大值的最小值。 方法1:容易想到的是动态规划 dp[i][j] = min(max(dp[k-1][j-1], sum[k][i]) 1 <= k <= i, dp[i][j]表示用前i个数字,分成j组,最大和的最小值 ti
阅读全文
摘要:分析:求一个区间最邻近的右边的区间在数组中的索引位置,右侧区间头要大于等于左侧区间尾。用map存区间头对应的区间索引。 标准库有map自己的lower_bound函数,返回大于等于key的第一个值的iteraotr。找右侧最邻近区间就是找 lower_bound(intervals[i][1]) .
阅读全文
摘要:分析:暴力枚举复杂度为$O(n^4)$,不可行。将A,B能组成的和用map计数,查找 -C[i]-D[j] 在map中是否存在 time $O(n^2)$ space $O(n^2)$ class Solution { public: int fourSumCount(vector<int>& A,
阅读全文

浙公网安备 33010602011771号