随笔分类 - leetcode
摘要:思路: 这个题目描述的就很迷,是看了讨论才明白在问什么。 题目说是包含所有不同字符的最小子序列, 所有不同字符说明 s字符串中所有出现过的字符都要有,最小说明满足前一个条件后,子序列要尽量让小字符排在前面,如ab和ba,那ab就是更小的。子序列,说明要是例子里面的子序列,如"cbacdcbc",输出
阅读全文
摘要:思路: 这种旋转数组的题,首先要确定一个旋转点。可以用二分法来寻找。 因为有特例,当旋转n次时,数组就还原了,这就不满足二分法的 二段性,这支博客解释过,所以我们要特别把这种情况单独考虑。然后其余的情况都可以用二分法找到旋转点,根据自己寻找的旋转点的细节来判断时right还是位与right+1的位置
阅读全文
摘要:思路: ###堆 这个题也可以用堆来做,和题313. Super Ugly Number的 堆做法一样。 通过大顶堆,即降序的堆来存放每个数,初始化res为1,因为这里的丑数的质因数只能是数组primes里面的,所以只要将2,3,5改为primes里的数即可。 在判断堆里是否有重复的元素,有则pop
阅读全文
摘要:思路: 和692.Top K words题目是相同的,一样的用hash map对出现的次数进行计数,然后最后再以pair的形式放如堆中,以出现次数为主要排序对象,用默认大顶堆即降序排序即可。 代码: class Solution { public: vector<int> topKFrequent(
阅读全文
摘要:思路: 因为还要考虑到字母顺序,所以肯定能用堆来存储。这里还需要先计数每个单词出现的次数,可以考虑用hash map来计数,再以pair的类型存放进堆,因为这里堆用大顶堆即降序排序,我们对出现次数取负值即可,然后每次加入进堆都判断一次是否数量大于K了,如果大于就pop掉堆顶元素,因为降序所以出现次数
阅读全文
摘要:仅供自己学习 思路: ###暴力 刚开始看确实没思路,用的暴力法。因为他要的数是质因数只为2,3,5的。那么我们只需要获得通过2,3,5相乘得到的数即可。通过三个循环,先a=a2,然后b=a,b=b3,最后c=b,c=c5,这样得到的c就是是由23*5得到的数,但是这样得到的数,没法确定大小关系,所
阅读全文
摘要:仅供自己学习 思路: 思路比较简单,但要注意细节处理。 一开始就是想遍历寻找nums[i]<nums[i-1]获得旋转点,然后对这两侧的数组分别使用二分搜索,但是一直报错,找不到原因。 根据题解二分可知二分的本质是二段性,而非单调性。只要一段满足某个性质,另外一段不满足这个性质就可以用二分。 对于一
阅读全文
摘要:仅供自己学习 思路: 题目要求原地算法,在考虑因为最大有两个重复元素。那么我们运用双指针,一个用来记录遍历过且修改为不重复的数组长度slow,一个用来记录当前位置的fast指针。这个问题容易找到超过两个元素的重复元素,但是如何去掉是个问题。 因为我们允许重复两个,那么我们每次判断都是slow-2的元
阅读全文
摘要:仅供自己学习 思路: 因为num1的空间能容纳num1和num2的内容,所以第一种方法就是可以把num2的数全加进num1中然后在sort即可。 相当于调用快排时间复杂度为O((m+n)log(m+n)),空间复杂度O(1) 第二种方法是创建一个数组,然后比较num1和num2的大小放入新数组,最后
阅读全文
摘要:仅供自己学习 思路: 需要定义两个栈st1,st2.第一次调用CQueue()时,可以用于清空两个栈。加入元素的函数直接加入进st1即可,对于删除函数,要先判断st2是否为空,如果不为空直接从st2弹出元素,如果为空就从st1一直加元素直到st1为空,如果st1为空,st2没有元素加进去,那么就返回
阅读全文
摘要:仅供自己学习 思路: 新建一个数组,用left和right两个指针,判断nums[i]是否为偶,如果是就res[right]=nums[i],否则从left位置加。 代码: class Solution { public: vector<int> exchange(vector<int>& nums
阅读全文
摘要:仅供自己学习 思路: 题目要求最小的颜色种类,这里要从相同数字入手。因为相同数字有两种可能,第一种是多个同种颜色的兔子在说他们这种颜色的有多少只,另一种是不同种颜色有相同的数量,这是解决问题的关键点。 我们需要进行统计找规律。[2,2,2],那么最少种类的可能就是只有一种颜色,数量为3,所有兔子都被
阅读全文
摘要:仅供自己学习 思路: 这种题应该用动态规划,因为上到n台阶的方案需要分成不同种方案,即上一层和上两层的多种组合。 首先考虑上到最后一层,可以有上一层台阶到达最后一层,也可以有上两层台阶到达最后一层,那么总的方法就有 dp[n]=dp[n-1]+dp[n-2]种。 因为题目给的范围不为0,所以dp[0
阅读全文
摘要:仅供自己学习 思路: 直接遍历判断即可 class Solution { public: int calculate(string s) { int n=s.length(); int x=1,y=0; for(int i=0;i<n;++i){ if(s[i]=='A') x = 2*x+y; e
阅读全文
摘要:仅供自己学习 思路: 按照题目要求我们需要定义一个head头节点,并且因为树是二叉搜索树,所以要采取中序遍历才能得到从小到大的排序。 按照中序遍历的模板 dfs(root->left); cout<<root->val; dfs(root->right); 同样我们也通过这个模板写DFS,这里因为是
阅读全文
摘要:仅供自己学习 思路: 因为这是求公共子序列,不是公共子字串,所以公共的元素可以不连续,那么暴力为每个字符找相同的字符就需要O(n^2)的时间。 考虑用两个string的长度做二维矩阵,用动态规划。定义dp[i][j]为text1长度为i,text2长度为j是的公共子序列长度,text[0:i]定义为
阅读全文
摘要:仅供自己学习 思路: 我们通过DFS递归把所有的分支到叶子节点的都计算看是不是满足这个目标值。 首先判断递归传入的root是否是NULL,如果是就返回,不是就把这个sum-root->val,然后加入进path中去,如果 sum=0说明这条路是满足了target,那么久加入进res中,加入后不直接r
阅读全文
摘要:仅供自己学习 思路: 因为要求接水的最大单位数,那么需要知道两侧的的高度。但如果遍历每一个位置再向两侧展开会很绕,需要很多if条件。如果我们从两侧向中间靠近则会容易理解得多。我们设置两个指针left和right,left指向第一个位置,right指向最后一个位置,在定义leftmax和rightma
阅读全文
摘要:仅供自己学习 思路: 思路比较简单,就是遍历整个矩阵,查找与word第一个字母相同的元素,然后搜寻他的上下左右的元素是否等于word的下一个元素,如果有一个方向有就从这个方向继续上述步骤。否则将会退出这个元素,从矩阵的下一个元素开始判断。实现的方法就是DFS回溯法。 我们当我们找到word相同元素的
阅读全文
摘要:仅供自己学习 思路: 自顶向下: 可以递归到最低层开始计算层数,当root为NULL时,就返回0,说明是最底一层。然后到上一个递归,因为上一个递归的root不为空,那么我们就return 左右子树中的最大层数+1,那么倒数第二层就是0+1,如此就能得到一个子树的最大深度了。这就是递归函数的内容,即获
阅读全文

浙公网安备 33010602011771号