一些思维习惯
如果数组排序不强调严格的顺序的话,可以考虑计数排序:
274.(Medium) H-Index
https://blog.csdn.net/AXIMI/article/details/102401476
一些二元状态的数组可以考虑使用bit数来表示其状态:
https://leetcode.com/problems/game-of-life/discuss/73223/Easiest-JAVA-solution-with-explanation
(这部分待补充)
1.Hash表的使用
1.two sum
https://blog.csdn.net/AXIMI/article/details/82729883
two sum就是从一个数组里面(无序)找到2个数的和是我们想要的目标。
可以建立一个Hash表,其中键是数字,值是数字的位置。然后设置循环看map中是否contain target-nums[i]这个键即可。循环的位置是从第一个数到最后一个数,不用担心会重复计算, 因为一旦找到了合适的一组数就直接break出去。
2.滑动窗口
3.longest substring with repeating charaters
https://blog.csdn.net/AXIMI/article/details/82827236
这道题的意思是找到一串字符串中没有重复字母的最大子串。
首先设置两个指针i,k,j
以i为基础,j一个一个右移,每移一位,k从j-1开始往前判断是否有字符和j重复
如果有重复的话,i的位置更新到k+1,j继续前移
如果没有重复的字符的话,看需不需要更新最长子串的长度和起始位置
53.Maximum SubArray
https://blog.csdn.net/AXIMI/article/details/84250739
这道题的意思是,给一串数字,求这串数字里面有最大和的连续数字子串。
就是维护一个滑动窗口,和一个values数组。加入当前指针指向的是位置i,则如果values[i-1]小于0就直接舍弃,如果values[i-1]是大于0的就保留。
209.(Medium)Minimum Size Subarray Sum
https://blog.csdn.net/AXIMI/article/details/89288464
这道题的意思是给定一个数组和一个数,求这个数组中的最短连续数,使得这段连续数之和大于等于给定的数
219.(Easy)Contains Duplicate II
https://blog.csdn.net/AXIMI/article/details/89481012
这道题的意思是给定一个数组,问这个数组中是否有重复的数字,且重复的数字之间间隔至多为k。
使用的是长度为k的滑动窗口,使用set集合来保存窗口中的元素,滑动窗口时如果set集合添加新元素失败,说明当前长度为k的窗口内存在重复的元素。
239(Hard)Sliding Window Maximum
https://blog.csdn.net/AXIMI/article/details/90414331
这道题的意思当一个窗口在数组上从左到右移动时,窗口中的最大数字会随之变化,要求窗口滑动过程中,这些最大值的数组。做题的方法是使用deque来维护窗口数值的变化过程。
3.归并排序
4.找到两个数组的中位数
https://blog.csdn.net/AXIMI/article/details/82827693
这道题用到了归并排序的思想,创建一个新的数组将这两个数组中的数字都保存在一起,然后再找中位数
4.贪心算法:
11 找到能装最多水的两根柱子
https://blog.csdn.net/AXIMI/article/details/82942420
这道题的解法是,设置两个指针分别指向最左和最右的两根柱子,如果左柱高于右柱,
右柱往中间走,否则左柱往中间走;
左右柱子每次移动都要计算当前的容器容量,然后看是不是需要更新
5.DFS、BFS、回溯
https://blog.csdn.net/AXIMI/article/details/83473015
这道题是解9*9的数独题。
主要思想是DFS+回溯,先找到坑,然后从1到9依次填进去,首先看满不满足行列子块条件,满足的话在这个基础上继续填坑,如果后面发现坑填不了了,就回溯到上一个。
17.Letter Combinations of a Phone Numbers
https://blog.csdn.net/AXIMI/article/details/83988986
这道题的意思就是,一个手机有3*3的键盘,每个数字都代表了不同的字母,按下不同数字可以组合出不同的字母。
51 .N Queens
https://mp.csdn.net/mdeditor/84024090
这道题是求N*N的棋盘上摆放N个皇后,要求所有的皇后不在同行不在同列不在同一个对角线。
解题思路是一行一行地填皇后,如果当前行的当前位置是正确的就递归填下一行,否则就移到当前行的下一个位置。
78.Subsets
https://blog.csdn.net/AXIMI/article/details/84374463
这道题是求一个数组中的数字能组成的所有子集合。比如[1,2,3]能组成[],[1],[1,2],[1,2,3],[2],[2,3],[3]这几个组合。使用普通的回溯即可。
另外这道还有一种解法是叠加的方法:
首先是[]
然后对于1,可以选1也可以不选1,这样下来就有:[],[1]
对于2,可以选2也可以不选2,有:
选2:[2],[1,2] 不选2:[],[1] 叠加起来:[],[1],[1,2],[2]
依次类推
79.Word Search
https://blog.csdn.net/AXIMI/article/details/84387945
这道题的意思是,判断一个word是否在一个字符数组中。
90 (Medium) Subsets II
https://blog.csdn.net/AXIMI/article/details/84650503
这道题的意思是找到一个数组的子集合,和subsets不一样的是,这里的数组内存在重复的数字,主要在于维护一个start,第一次做的时候还是比较麻烦的
93.(Medium) Restore IP Addresses
https://blog.csdn.net/AXIMI/article/details/84701975
这道题的意思是,给一串数字,返回所有可能的IP地址值,很典型的回溯
95.(Medium) Unique Binary Search Tree II
https://mp.csdn.net/postedit/84783727
这道题是求满足Unique Binary Search Tree的所有的树
126.(Hard) Word Ladder II
https://blog.csdn.net/AXIMI/article/details/84939525
这道题就是给一个起始单词和目标单词,要求从一堆单词里面找到一个“梯子”(一组单词)可以让起始单词“走到”目标单词。
使用了BFS和回溯
6.多边界问题
41.First Missing Positive
https://blog.csdn.net/AXIMI/article/details/83582287
这道题的意思是找到数组中最小的缺失的整数,比如
[-1,0,2,3]是1;
[4,5,6]也是1;
[-4,-3,-2]也是1;
[1,2,4,5]是2
解题的基本思路是首先要排序(归并),然后去除重复的数值;
最后找到第一个非负数,然后从这个非负数开始,用折半查抄看哪一半的数是不连续的;
这个题不难,就是需要考虑的边界,一些细节的操作比较多
7.动态规划(DP)
72.Edit Distance
这道题的意思是计算要多少步才能将一个字符串转换为另外一个字符串,比如要多少步才能将horse转化为ors。(能采取的步骤包括增加一个字母、减少一个字母和替换一个字母)。
做法就是维护一张二维DP表。
https://blog.csdn.net/AXIMI/article/details/84144759
62.63 Unique Path && Unique Path II
就是简单DP
87(hard) Scramble String
https://blog.csdn.net/AXIMI/article/details/84501375
这道题是自定义了两个数组互为Scramble String的方式。
要建立一个三维的数组dp[len][i][j],表示第一个字符串从第i位开始取字符,第二个字符串从第j位开始取字符,取长度为len时,当前取到的两个字符串是否互为Scramble String.
是目前做到唯一一个三维dp题。
97.(Hard) Interleaving String
https://blog.csdn.net/AXIMI/article/details/84529398
这道题的意思是有两个字符串是否可以通过拼凑的方式组成第三个字符串。做法也是维护一个二维dp数组。
96.(Medium) Unique Binary Search Tree
https://mp.csdn.net/mdeditor/84784888#
这道题是求1-n个数字可以组成多少个有效的搜索二叉树,使得中序遍历时的输出为1-n。
132.(Hard) Parlindrome Partitioning II
https://blog.csdn.net/AXIMI/article/details/84986659
这道题是,一个字符串,至少要划多少刀才能将这个字符串划分为一个个的回文子字符串。
做法是创建一个二维boolean数组,数组第i行第j列的元素记录字符串中第i位到第j位的子串是否构成回文串,然后再通过这张表计算需要划分的刀数。
139.(Medium) Word Break
https://blog.csdn.net/AXIMI/article/details/85044766
这道题是给一个字符串目标,给一个字符串数组,问能否用数组的字符串拼成目标字符串。
主要想法是建立一个boolean数组,数组中第i位表示目标字符串的第0位到第i位能否被数组中的字符串表示出来。
有点难度,刚开始没想出来
140.(Hard) Word Break II
https://blog.csdn.net/AXIMI/article/details/85051120
这个题在Word Break的基础上,要求求出所有能拼出目标字符串的组合。主要想法是建立一个boolean数组,用于记录目标字符串的第i位是否可以是字符串数组中的某个字符串的开头,例如对于:
目标字符串:catsanddog
字符串数组:cat, cats, sand, and, dog
来说,boolean数组的值为:
字符 | c | a | t | s | a | n | d | d | o | g |
---|---|---|---|---|---|---|---|---|---|---|
boolean数值 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
这道题我也觉得有点难,这道题用回溯的话会超时
174.(Hard) Dungeon Game
https://blog.csdn.net/AXIMI/article/details/87940068
一个经典的DP题,需要注意的是这里DP的路径是从下到上从右到左(即从公主的位置来一步步计算骑士的血量)
8.单调栈(monotone stack)
42.traping rain water
这道题的意思就是一些不同高度的柱子可以积累多少雨水的问题
使用减单调栈,栈中的元素是柱子的下标而不是高度。当下一个柱子比栈顶的柱子低时入栈,否则出栈。出栈的时候先计算高度差,再利用柱子之间的距离(已记录在栈元素中)来计算当前这几根柱子可以积累的雨水。
https://blog.csdn.net/AXIMI/article/details/83617217
84.(Hard) Largest Rectangle in Histogram
https://blog.csdn.net/AXIMI/article/details/84205795
题目给定了一个连续的方柱,要求找到最大的矩形。
使用增单调栈
9.找规律
59.Spiral Matrix && Spiral Matrix II
https://blog.csdn.net/AXIMI/article/details/84255343
https://blog.csdn.net/AXIMI/article/details/84287370
第一个问题是给你一个矩阵,然后求这个矩阵中的数字按照螺旋输出应该怎么输出;第二个问题是利用数字1—n^2,填充一个n*n的矩阵。
60.Permutation Sequence
https://blog.csdn.net/AXIMI/article/details/84288528
这道题是让你求n的数的全排列中,按照顺序的第k位应该是多少
规律还是比较明显的
10.分治
75.Sort Colors
https://blog.csdn.net/AXIMI/article/details/84327713
这道题的意思就是一个数组里面有0、1、2这三个数组,然后将这些数字按照0、1、2的顺序来排列。
一般的做法是统计这三个数字分别有多少个,然后再重新填进数组里面。
这里也可以用partition的做法,就是设置3个指针然后分情况来填充数字
11.树
99.(Hard)Recover Binary Search Tree
https://blog.csdn.net/AXIMI/article/details/84633797
这道题的意思是有一颗二叉树的两个结点的值被调换了,修复这个二叉树。
使用书序Morris遍历。
98 (Medium) Valid Binary Search Tree
https://mp.csdn.net/postedit/84790594
这道题是验证一棵树是否是有效二叉搜索树。做法是morris遍历
101.(Easy) Symmetric Tee
https://blog.csdn.net/AXIMI/article/details/85053905
题目是判断一棵树是否是对称,做法是双指针的morris遍历
145.(Hard) Binary Tree Postorder Traversal
https://blog.csdn.net/AXIMI/article/details/85063278
求树的后序遍历,使用morris遍历
102.(Medium) Binary Tree Level Order Traversal
https://blog.csdn.net/AXIMI/article/details/85273078
就是一层一层地输出树每一层的结点值
103.(Medium)Binary Tree Zigzag Level Order Traversal
z字输出一个树中的结点的值
104.(Easy)Maximum Depth of Binary Tree
求解树的最深的的深度
105.(Medium)Construct Binary Tree from Preorder and Inorder Traveral
使用一棵树的前序和中序遍历结果来重现这棵树
106(Medium)Construct Binary Tree from Inorder and Postorder Traversal
使用一棵树的中序和后序遍历结果来重现这棵树
129.(Medium) Sum Root to Leaf Numbers
https://blog.csdn.net/AXIMI/article/details/85601567
方法是从底向上,将左右子树的值加入到父节点,然后父节点再一层一层地上传数值。
100-150很多关于树的题目
12.基础迭代
基础迭代是最佳买卖时间的那三道题。感觉就是第一次买入价随时可以更新,第一次卖出价要在第一次买入价的后面才能更新,第二次买入价要在第一个卖出价的后面才能更新…
121.(Easy)Best Time to Buy and Sell Stock
https://blog.csdn.net/AXIMI/article/details/85525337
13.位操作
136.(Easy)Single Number
https://blog.csdn.net/AXIMI/article/details/86062580
这道题的意思是一维数组中所有数字都出现了两次,只有一个数字出现了一次,要求把这个数字求出来。使用的XOR异或。
137.(Medium) Single Number II
https://blog.csdn.net/AXIMI/article/details/86073217
所有的数字都会出现3次,有一个数字只出现一次,要求出这个数字
14.图
133.(Medium) Clone Graph
https://blog.csdn.net/AXIMI/article/details/85989101
题目给了一个图的顶点,要求复制这个图,然后把新图的对应顶点传回去
用的DFS,就是维护一张map,键是原图已经复制过的顶点,值是这个顶点对应的新顶点。对于当前已经复制好的顶点,如果原图中它的邻节点是已经复制过的顶点则将这个节点加入到当前节点的邻节点中,如果是没有存在过的节点就深搜这个邻节点。
15.链表
92.(Medium)Reverse Linked List II
https://blog.csdn.net/AXIMI/article/details/84699150
这道题的意思是将链表中的第i位到第j位翻转一下。
其实衍生到单向链表的翻转问题。
方法改造类问题
- Min Stack
这道题的意思是改造一下Stack以实现下面的功能:
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.
JAVA中原本的Stack可以实现的功能有:
pop() push() empty() peek() search()
然后这个题的主要问题时需要实时得到一个getMin(),即随时能知道栈的最小元素。
解法是每次push进来一个元素时,如果这个元素比之前的最小值小,则将这个最小值入栈保存,这样当pop出当前的最小元素时,栈顶的元素就是上一个最小元素。
225 Implement Stack using Queues
循环中的双指针
202 (Easy)Happy Number
https://blog.csdn.net/AXIMI/article/details/89111050
这道题的意思,如果一个数,不断计算各个位数上的数字的平方和,然后迭代的话,如果最后可以得到1则认定该数为lucky number。如果计算进入循环,则不是幸运数。
我之前的计算过程是使用一个map记录计算过程中的每个数,这样空间复杂度大概就是O(n)
但是如果使用slow和fast的双指针来遍历的话,空间复杂度就是O(1)
Majority Voting Algorithm(多数投票算法)
229.229(Medium)Majority Element II
https://blog.csdn.net/AXIMI/article/details/90272251
位操作问题
231.(Easy)Power of Two
https://blog.csdn.net/AXIMI/article/details/90312079
知识点就是,如果n&(n-1)==0的话,n就是2的幂次(1,2,4,8…)。2的幂次都是只有一个位数上是1的,这个随便试一下就可以验证。
或者n&(-n)==n的话,这个数也是2的幂次。
递归
241(Medium)Different Ways to Add Parentheses
https://blog.csdn.net/AXIMI/article/details/90551113