LeetCode
文章平均质量分 64
Joseph_L_
Ain't no mountain high enough
展开
-
【字符串】最长公共前缀
求字符串数组里的字符串公共最长前缀大致思路:先对字符串排序,然后只需要比较第一个和最后一个的字符串,这两个字符串必定是差距最大的两个(因为排序首先从第一个开始排),如果首字符不等,就返回空,否则,说明所有字符串的首字符相等,那么接着判断第二个字符。AC代码:class Solution {public: string longestCommonPrefix(ve...原创 2019-06-23 16:14:38 · 2327 阅读 · 0 评论 -
【数组】删除重复元素(最多重复两次)
只能允许最多重复两次,修改数组删除多余元素,并且返回删除后的数组长度。大致思路:刚开始想的是一个哈希数组来存出现次数,然后判断>2次的时候通过前移后面的部分来删除该元素。确实时间复杂度是O(n^2)太高了。还是要仔细读题!这是一个sorted array,也就是判断一个元素是否出现了两次,只需要看它前面的前面那个元素是否和它一样,一样则不要它,不一样则说明它还没有重复出现到两...原创 2019-06-17 11:30:41 · 1547 阅读 · 0 评论 -
【链表】删除重复结点
只是需要删除重复的多余结点,保留1个就行。大致思路:只需要在当前结点来进行处理就行,因为只是删除多余的,也不用担心头结点会被删去导致返回的不对的错误。一次AC。AC代码:class Solution {public: ListNode *deleteDuplicates(ListNode *head) { //看结点后面的值是不是一样,一样就跳过,直...原创 2019-06-17 10:41:12 · 490 阅读 · 0 评论 -
【算直方图最大矩形面积】了解即可
Givennnon-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.Above is a histogram where width of each b...转载 2019-06-17 09:19:12 · 342 阅读 · 0 评论 -
【链表】partition list
给你一个单链表和一个数x,让小于x的结点都排到前面去(保证稳定性)。大致思路:刚开始我就像“反转链表”那道题一样想着头插法,先找到第一个>=x的结点然后再来遍历一次来头插,发现要考虑的因素特别多,还要考虑头结点会不会就是>=x的要被头插,那又像那道题一样要讨论。写出代码调好后,发现超时。。。后来想想,这种方法确实是完全一点辅助空间都不用。干嘛不用辅助空间??况且,其实对...原创 2019-06-16 19:49:52 · 133 阅读 · 0 评论 -
【字符串】scramble string
相当于按这种二分(也不算找中心分啦)的结构,结构之间可以互换顺序,结构之内(由于又可以二分)也可以互换顺序。问你两个字符串互不互为这种关系。大致思路:刚开始没反应过来——其实这也是求“字符串的全排列”是否对应——>看各字母出现的次数。只不过,这涉及到二叉树的结构,很明显又让人知道要——递归。所以,就是遍历i来分割出不同的二叉树结构,然后递归地来看两个子树是不是满足全排...原创 2019-06-16 16:52:12 · 376 阅读 · 0 评论 -
【数组】合并两个数组至有序 无需新建数组
是在A数组的原基础上直接进行merge。方法是从后往前merge(数组长度为m+n),依次取最大的放上去。不要担心A数组的原有元素被覆盖掉,因为分析代码,那个被覆盖的元素应该已经出现在了数组后面。AC代码:class Solution {public: void merge(int A[], int m, int B[], int n) { int i ...原创 2019-06-16 15:55:20 · 459 阅读 · 0 评论 -
【链表】反转链表II:只反转一部分结点
大致思路:就是用头插法反转,只不过要对可能的情况多加考虑!把链表分为三部分:前面不反转的before->h中间反转的->p后面不反转的。在遍历的过程中记录结点指针,最后进行连接。实现之后发现有指向空指针什么的,发现是因为before初始化为NULL,但如果m==1,即从一开始就开始反转,就没有“前面不反转的部分”了,所以最后的before->next=h的连接就会...原创 2019-06-16 14:50:48 · 965 阅读 · 0 评论 -
【动态规划】求二叉树的结构情况数
动态规划的思想,dp[i]表示有i个结点可以构成的二叉树结构情况数。遍历选取第j个结点作为根节点,则dp[n]+=dp[j-1]*dp[i-j]class Solution {public: int numTrees(int n) { if(n<0) return 0; int dp[2000]={0}; ...原创 2019-06-16 11:42:12 · 363 阅读 · 0 评论 -
【字符串】判断s2是否是s1的旋转字符串
题目Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstri...原创 2019-06-16 11:01:06 · 822 阅读 · 0 评论 -
【滑动窗口】判断s2是否包含s1的全排列
大致思路:s2必须要包含s1的某种排列,必须是包含的那种连续的。刚开始我用全排列输出各种s1的排列,在递归的临界条件那儿判断是否被s2包含。显然,就算剪枝仍然超时,想想确实也是,人家递归类似于dfs是用来输出详细的组合信息的,而这里好像没这个必要这样做。不过,这个代码仍然有值得学习的地方:①输出全排列的递归算法温习(当前字符在或不在之后的组合中,若在则需要遍历位置);②判断两个字符串的...原创 2019-06-16 10:57:22 · 1599 阅读 · 0 评论 -
【动态规划】字符串-分词
大致思路:不要浮躁!静下心来仔细分析问题,给问题划分步骤:其实肯定是要把dict中一个词一个词地去比较是否为s的子串,那么主要就是两个点:①找到子串起始位置 ②对子串的长度进行规定以便与单词比较所以,很可能就是两个循环的事情。现在要构思如何设计动态规划dp数组的含义:dp[i]==true表示0~i-1都可以分词,那么现在得从i开始看能不能子串从i这里开始能匹配上一个单词。需要用...原创 2019-06-04 16:00:58 · 732 阅读 · 0 评论 -
【dfs】word search
典型的dfs,去找这个阵型中有没有一条路是给出的单词。大致思路:dfs。注意点:vis数组别忘了写!!!!!if判断中要判断边界、题目条件还要判断是否访问过!!然后,还要在dfs的上文置vis[xx][yy]=1(尤其是如果在主函数中第一次调用,也要记得),在dfs的下文还原vis[xx][yy]=0,表示不走这条路,换一条路!AC代码:class Solution {pu...原创 2019-06-17 14:18:30 · 185 阅读 · 0 评论 -
【dfs“要”或“不要”】求子集;求组合
求一个序列的所有子集。大致思路:也是用dfs来做的,因为其实就是“要”或“不要”的问题,这是dfs可以解决的典型问题!注意:sort(start,end,排序方法),一般来说end=start+size(),但是vector有.begin和.end()指针就直接用呗。 vector的push_back是添加元素到末尾,那么pop_back则是删除末尾元素!...原创 2019-06-17 14:58:36 · 518 阅读 · 0 评论 -
【数组】sort colors
在原数组上不用sort函数来进行这样的一块儿一块儿的排序。大致思路:因为题目明确说用不要开辅助空间,也就是要在原数组上进行操作。我第一反应是:两个指针fast和slow,果然,这是正确的!因为题目说的场景也简单,直接手写一个例子,模拟快慢指针,找到规律,一次AC。AC代码:class Solution {public: void sortColors(int A...原创 2019-06-17 16:54:33 · 140 阅读 · 0 评论 -
【set存储:去重+排序】4sum
从给定的数组中找到4个数的组合,和==target。组合不能重复,按非递减顺序。大致思路:要或不要,dfs。但是AC代码(别人的题解)里的剪枝很棒,结合了“按非递减顺序——递增顺序”的题意。另外,对于重复的问题,使用的是set来对vector<int>型的变量去重(比去find那种要快,而且不需要对结果重新排序)AC代码:class Solution { ...原创 2019-06-22 21:58:30 · 495 阅读 · 0 评论 -
【二分快速幂】pow x-n
大致思路:温习二分快速幂的写法。注意,n有可能为负数!AC代码:class Solution {public: double pow(double x, int n) { if(n==0) return 1; if(n==1) return x; if(n<0) //注...原创 2019-06-18 16:46:39 · 174 阅读 · 0 评论 -
【拖累思想】maximum subArray 求最大子数组
求(连续)子数组的最大和大致思路:一次AC,用到了我的“拖累思想”。AC代码:class Solution {public: int maxSubArray(int A[], int n) { if(n==0) return 0; if(n==1) return A[0]; ...原创 2019-06-18 16:23:02 · 163 阅读 · 0 评论 -
【找规律】求123456789的第几个全排列
1~n(最多n=9即123456789),让你来求第K个全排列。(题中告诉你规律:1234...n的全排列一共有n!个)大致思路:举例子找规律的题,见下面这个例子:以n = 4, k = 17的情况来分析,所有排列组合情况如下:123412431324134214231432213421432314234124132431312431423214...原创 2019-06-18 15:26:06 · 3609 阅读 · 0 评论 -
【链表】rotate list
将最右边的K个元素拼接到最前面去。大致思路:我举了个1->2->3的例子模拟了一下,发现就是先一遍循环得到链表长度和链表最后一个结点指针tail,再来一遍循环直到n-k个元素,那么它的下一个元素就作为结果链表的头,让它断开,再把tail->next=head; 最后返回结果链表的头。思路正确。我发现我现在的链表题编程,需要注意的两个点:① 要找准返回的头在哪里...原创 2019-06-18 11:16:34 · 122 阅读 · 0 评论 -
【数位】reverse integer
反转数位。大致思路:对负数要有处理。关键是如何判断溢出(这里要理解,传进来的int型参数比如1000000003是不溢出的,但翻转后的3000000001溢出了)。看了大佬的方法,就是:判断这一次得到的res能不能返回去得到上一次的res,如果返回去不相等,则说明这一次的res溢出了。AC代码:class Solution {public: int revers...原创 2019-06-25 17:03:24 · 152 阅读 · 0 评论 -
【数位】palindrome number
用常数空间,判断一个数是否是回文的。大致思路:我就是从数位的思想上一位一位去比较的,从低位开始比较是简单的,不过要想从高位开始,得先知道这个数是几位的。我才用的方法是让Left=1,每次*=10,如果这个数/left==0即可。也就是这个x的最高位也就是Left级别的(比如5000,left=10000)不过要注意溢出,尤其是Left容易溢出,所以用long long 来装!A...原创 2019-06-25 16:38:35 · 114 阅读 · 0 评论 -
【字符串】生成匹配的括号
给出括号对数n,生成这n对匹配括号的全排列大致思路:我用的是dfs,做出来了。看到了一种更简单的方法:只要保证右括号个数不大于左括号就行了(若当前左括号个数>右括号个数,可加右括号)!AC代码:链接:https://www.nowcoder.com/questionTerminal/c9addb265cdf4cdd92c092c655d164ca来源:牛客网cla...原创 2019-06-21 21:02:01 · 473 阅读 · 0 评论 -
【动态规划】edit distance 一个字符串->另一个字符串的编辑距离
一个字符串到另一个字符串,3种操作(增加、删除、替换),问要做多少步。大致思路:这道题的动态规划让我理解了一个小时。。。。。来看方法:理解的基础是要get一个点:f[i][j]表示word1[0..i]已经成功转换成word2[0...j]了的步数!所以,在聚焦于看一个字符时,来想想是怎么达到f[i][j]这个目的的,从而推出状态转移。就三种方法嘛:替换 删除 添加。那...原创 2019-06-17 20:44:30 · 217 阅读 · 0 评论 -
【链表*】交换结点
只要涉及到链表结点的删除或交换,就必须新建虚拟头结点newHead->next=head,让f指针指向newHead作为前置结点指针(删除和交换都需要前置结点指针的),newHead当然不动,程序最后返回的是newHead->next。两个两个地交换结点两个两个地就地交换结点。大致思路:一定要先新建一个虚拟结点newHead,newHead->nex...原创 2019-06-21 19:29:26 · 5828 阅读 · 0 评论 -
矩阵的旋转
记住方法即可。(这里的矩阵都是方阵哈。)矩阵的逆时针旋转90°:先把主对角线两边的元素互换,再把第i行和第n-i行互换。矩阵的顺时针旋转90°:先把副对角线两边的元素互换,再把第i行和第n-i行互换。比如,对于顺时针旋转90°的AC代码:void clockwise(int a[][4],int n){ for(int i=0; i<n; ++i) ...原创 2019-06-15 22:22:53 · 1830 阅读 · 0 评论 -
【动态规划】interleaving string 两个字符串交叉得到另一个字符串
大致思路:(via简书yoshino)这种又是涉及两个子串的题,又用动态规划来做。但是有时候很不好想到动态规划的含义,我觉得就大胆一点吧....而且一般这种字符串的动态规划都是跟“长度”有关!然后再举简单的例子来模拟过程,从而设计出转移方程!这道题过程看懂了就很好理解的,只是在编程要注意:dp数组下标从1开始,表示的是“第几个”或“有多长”,而字符串肯定是从0开始的。AC代码:...原创 2019-06-15 21:40:50 · 364 阅读 · 0 评论 -
*【动态规划】求子序列的个数 distinct subsequences
大致思路:其实本质是“求子序列的个数”。很明显,这种问个数的,一般用动态规划来做。这道题和“求最长公共子序列”(https://blog.csdn.net/m0_38033475/article/details/79492786)有些类似。类似的地方在于:序列都是可以不连续的。不同的地方在于:最长公共子序列是两个序列都随便出,找相同序列的最长的长度;这道题是母串必须包含子串的全部,而且...原创 2019-06-15 20:42:05 · 3153 阅读 · 0 评论 -
【数组】first missing positive
正数要连续起来,找到第一个缺失的正数。大致思路:刚开始想着用动态规划什么的,发现要O(n)即不能sort,而且不能用空间,所以dp数组打扰了。一看题解....好简单....:Put each number in its right place.For example:When we find 5, then swap it with A[4].At last, th...原创 2019-06-18 21:24:53 · 141 阅读 · 0 评论 -
【模拟过程找规律】trapping rain water
如图。大致思路:理解题意,模拟过程,找到规律。先找到最高的,那么左边就从左往右看,右边从右往左看。AC代码:class Solution {public: int trap(int A[], int n) { if(n==0) return 0; if(n==1 || n==2) r...原创 2019-06-18 21:07:27 · 142 阅读 · 0 评论 -
【字符串】wildcard matching 匹配*?正则表达式
匹配一个字符串是否满足另一个字符串给出的*?表达式,注意*可以代替一切字符(包括空),?可以代替单个字符。大致思路:匹配流程我是写出来了的,最简单的是比较相应的单个字母或?,难点在于不知道‘*’能代替s里的多少个字符(包括空)。解决想法就是说,先代替0个试试,走到后面不行了再回来代替1个。因此,需要两个指针indexstar和indexmatch来记录。indexstar记录在正则...原创 2019-06-18 20:07:25 · 253 阅读 · 0 评论 -
【leetcode】KMP
又码了一遍KMP...发现如果不看书一开始还是自己码不出来...一定要理解啊!!!注意next数组其实在做next[i+1]。而判断查找到完整子串的依据是看子串的下标是否“走到底”了。这道题其实就用KMP就行了。只不过它默认是string类型的,而我模板是针对“以1为开始下标的char数组”,所以要通过遍历转存一下。·不知道为什么没有AC全部的代码:class Solutio...原创 2019-04-04 21:08:51 · 1370 阅读 · 0 评论 -
【leetcode】已排好序的数组去重
·大致思路: 刚开始没想到那么简单的思路,其实只需要两个索引——i,j,i不动,等着j往后去比较,如果比较到和当前i位置的值不一样,则需要i++,设为当前j位置的值。·AC代码:class Solution {public: int removeDuplicates(vector<int>& nums) { if(num...原创 2019-04-04 20:17:47 · 525 阅读 · 0 评论 -
【LeetCode-动态规划】Triangle
我弄成了dp二维数组,超时,实际上只需要一维数组来保存dp值,也就是说只需要看列号取最小值而不用看行号。// top-down int minimumTotal1(vector<vector<int>>& triangle) { vector<int> res(triangle.size(), triangle[0][0]); for ...原创 2018-03-06 20:26:02 · 184 阅读 · 0 评论 -
【蓝桥杯-动态规划】 Longest Ordered Subsequence
问题链接:ZOJ2136 Longest Ordered Subsequence问题简述:参见上述问题描述。大致思路:首先要想到是动态规划问题。如何想到?你肯定要遍历,去找从开头到当前数的递增序列的数的个数,是取决于该递增序列在你前面那个(次大)数的最长递增序列的数的个数+1. 而且你想嘛,每个数对应一个个数值,应该是用数组来遍历的,这就更符合动态规划了。然后你就想原创 2018-01-26 10:52:30 · 174 阅读 · 0 评论 -
【LeetCode-动态规划-记特殊方法题】Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?For example,Given n = 3, there are a total of 5 unique BST's. 1 3 3 2 1 \原创 2018-01-26 10:15:14 · 204 阅读 · 0 评论 -
【LeetCode-动态规划】Minimum Path Sum【重要->状态转移方程取最值】
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.Note: You can only move either down or right at原创 2018-01-26 09:41:34 · 190 阅读 · 0 评论 -
【LeetCode-动态规划】Climbing Stairs【较重要:含dp解题思路套路】
You are climbing a stair case. It takes n steps to reach to the top.Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?Note: Given n will be a posi原创 2018-01-26 08:37:10 · 579 阅读 · 0 评论 -
【LeetCode-动态规划】Unique Paths
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).The robot can only move either down or right at any point in time. The robot is trying to reach the bo原创 2018-01-26 08:44:01 · 157 阅读 · 0 评论 -
【链表排序】对单链表归并排序 + 插入排序
【对单链表的归并排序】大致思路:单链表排序——归并排序!首先要理解归并排序的“分治思想”,会写归并排序。归并排序的一般步骤为:1)将待排序数组(链表)取中点并一分为二;2)递归地对左半部分进行归并排序;3)递归地对右半部分进行归并排序;4)将两个半部分进行合并(merge),得到结果。所以对应此题目,可以划分为三个小问题:1)找到链表中点 (快慢指针...原创 2019-06-02 15:23:48 · 491 阅读 · 0 评论