leetcode 整理
1.Two Sum
构造Comparator,KSum 这一类的问题最基本的一题, 解法:
先sort,然后双指针,头尾各一个。进行加逼找值。
对于其余的KSum最终是降次到2次。 如3Sum固定一个,然后找另外两个。 4Sum两两一组然后在对pair进行操作。
二分查找的应用。
二分查找的结果肯定是start > end。注意分的两个区间是 start, mid -1 和 mid + 1, end。
这里的话每次只能减少某个array长度的一半。
3. Longest Substring Without Repeating Characters
桶排序应用。存放某char在string中的位置。不要忘记了最后还有一次比较。
通过巧妙的复用carry 可以明显降低代码长度。
5.Longest Palindromic Substring
可以将长度为奇数的substring 和 偶数substring 归并到一起。 即使用两倍长度进行循环。 如果是点 则以为中心, 如果是中间,则以两边的点为中心。
找规律。。。
这题真心不难,只是要弄清楚存在的test case。
这题貌似没什么别的解法了,就是取值进行比较即可。
10.Regular Expression Matching(*)
有待研究。。
为什么双指针能够得到最优解?
12.Integer to Roman Roman to Integer
没啥特别的
顺序比就行了。
14.3Sum
关键在于去重。j,h 都要大于i, 同时 i,j,h变化时必须变成和原来不同的值。
15.3Sum Closest
从某种意义上来说这题更简单。 因为不需要考虑去除重复的问题。
16.4Sum
在3Sum外面再加一层循环即可。
17.Letter Combinations of a Phone Number
不难
18.Remove Nth Node From End of List
使用头指针会使得问题变得更加简单化。链表的题一定要使用头指针!
Parentheses这一类的题目都是用stack来做的。
一样的, 每一步可以加'(' or ')'。 ')'只有在还有'(' 没有匹配完的情况下才能加。
考虑下如何只使用constant的extra space 来做。
指针的操作,考虑下停止条件和 奇数偶数的情况即可。
23.Reverse Nodes in k-Group(*)
it is the same question as reverse linked list. Solved!
24.Remove Duplicates from Sorted Array
这个方法记下来。
和上一题一样。
26.Implement strStr() (*)
这一题的KMP算法 还是过不了大数据。 如果不考虑优化时间复杂度则直接查询即可。
27.Divide Two Integers (*)
位运算!
28.Substring with Concatenation of All Words (*)
很直接, 暂时还没考虑降低复杂度。
29.Next Permutation (*)
算法很巧妙。
30.Longest Valid Parentheses (*)
有待研究,我只想出来了用stack的方法。
31.Search in Rotated Sorted Array
如何判断二分的条件很关键,关键看哪部分是sorted的, 用这一部分来进行判断。
一次找左边界 一次找右边界。 其实也是二分。
采用二分,加快速度。
34.Valid Sudoku
很简单。
典型的迭代算法。未找到加速的方法。
一层一层的产生就行啦。
排序的方法。 1. 对原始array排序 2.去重 3.再选取的数字必定不小于之前的数字。
这里只比上一题改了一点,不能去重,而是要求在同一个位置上 不能取同样的数字。
就是桶排序,只不过不许用额外空间。
这题也是波的那类题, 从左到右算一遍, 从右到左再算一遍。
利用integer array可以简化计算! 很方便!
42.Wildcard Matching (*)
43.Jump Game
存当前位置能到的最远长度即可, 如果长度不小于0,则可以。
44.Jump Game II (*)
只能采用greedy做,依旧贪心去推,贪心的规则就是在能够到达的范围之内,选择一个能够到达最远距离的点,更新步数,和更新最远到达的范围。
45.Permutations
就是递归。。
和permutations 基本一致, 只是需要先把array 排序,然后保证在同一次循环中选取的数字不同即可。
47.Rotate Image
没啥难的地方,弄清楚变化的方式就行了。
48.Anagrams
这题就是硬算,把每个string sort,然后归类,将出现次数多于一的返回。
49.Pow(x, n)
应该用二分法,过大数据。
50.N-Queens
check diagonals: if the distance beteen the columns equals the distance between the rows, they are in the same diagonal.
很好的算法。
也是一个排序的问题,没有特殊的。
先把interval 按start time 排序,再添加。 保存当前的最大end time。
和上一题做法一模一样。
这题很简单,但是要注意,string 后面可能有连续的空格,which is meaningless。
same, 也就是一个顺序的问题,注意n的单复数。
算法很简单,但是写出来还是有难度的。
59.Rotate List
首先从head开始跑,直到最后一个节点,这时可以得出链表长度len。然后将尾指针指向头指针,将整个圈连起来,接着往前跑len – k%len,从这里断开,就是要求的结果了
60.Unique Paths
非常easy的dp。
加上一个对obstacle的判断即可。
和上面一样,只是每一步时取最小长度。
需要考虑哪个list先完。
64.Add Binary
可以使用位运算。 ^ 异或。
65.Valid Number
boring, 要考虑太多case。
66.Plus One
so easy
68.Sqrt(x)
使用二分来做。
69. Climbing Stairs
最base 的迭代。
利用堆的性质做就行了。 主要注意. 和 .. 的作用
71. Edit Distance
好题! DP的好题。
关键在于复用现在的matrix 来存储需要变0的行列的信息。
找到哪些地方要设为0很容易,但是注意当变0的时候一定要注意顺序,不要后面又check之前改过的值,这样会把全部都变成0。
使用两次二分来加速。 一次是找到不大于target的col= 0的最值, 第二遍遍历这一row 然后找target。 如果找不到 就return false。
74. Sort Colors
使用双指针来做, 左右各有一个指针来说明边界。
注意target sting里面可能有重复。 先对target进行预处理,可以使用hashmap或者 arrays。使用双指针来做, 先移动tail,找到一个包含了全部target string的tail, 然后移动head 找最小长度。接着再次移动tail, 对应移动head。 直到tail到length end。
76. Combinations
采用位运算来做,但是这样时间复杂度很高O(n* 2^ n)。for(int i = 0; i < Math.pow(2,n); i ++)
77. Subsets
采用位运算做, 注意结果的顺序。
78. Word Search
这题只能一个一个的expand。 算法没有复杂的地方。
79. Remove Duplicates from Sorted Array II
先排序,然后有三种允许的情况可以添加。
80. Subsets II
和subsets 一样,不过在加入到result list前先要进行判定, 使用hashmap。
81. Search in Rotated Sorted Array II
主要当duplicate被分在array的首尾的时候,这时候先要去掉这些duplicate。
82. Remove Duplicates from Sorted List
指针操作。 注意对duplicate的判断和操作。
83. Largest Rectangle in Histogram (*)
stack的应用。 很巧妙
先降成1维, 然后在递归到二维。 和find maximum subarray 升维到 find maximum submatrix解法一样。
85. Partition List
就在原来链表上修改。 将大于target的数字放到原来list的tail处。 动态的维护一个边界即可。
86. Scramble String
用DP来做,从顶往下走,一定在某一部能发现 s1 的左子树 等于 s2的右子树, s1的右子树 等于 s2的左子树。
从后往前做,注意判断的条件。
88. Gray Code
基于原来的代码进行扩充的,只是注意在扩充的时候需要反序(mirror),然后再乘上2的乘方即可。
89.Decode Ways
从前往后做,这样更简单。 典型的DP, matrix[i + 1] = matrix[i] + matrix[i - 1]
90. Reverse Linked List II (*)
注意链表的操作。
注意高位不能为0.
92. Unique Binary Search Trees
对于每个树,其个数等于 左子树的个数 * 右子树的个数。
93. Unique Binary Search Trees II (*)
94. Binary Tree Inorder Traversal
很简单的中根遍历, 使用recrise。
95. Interleaving String (*)
二维DP,很典型!
96. Validate Binary Search Tree
可以使用递归! tree的题目都尽量使用递归做!
97.Same Tree
很基础的。
98.Recover Binary Search Tree (*)
99. Symmetric Tree
很基础的tree, 比较left 和 right即可。
100.Binary Tree Level Order Traversal
tree的BFS
101. Binary Tree Level Order Traversal II
和上一题一样的
102.Binary Tree Zigzag Level Order Traversal
先输出成arraylist,然后再反转即可。
103.Maximum Depth of Binary Tree
一样的。
104. Minimum Depth of Binary Tree
和上题一样。
105. Construct Binary Tree from Preorder and Inorder Traversal
找规律, 利用recursively 做。
106.Construct Binary Tree from Inorder and Postorder Traversal
和上一题一样。
107.Convert Sorted Array to Binary Search Tree
利用recurse 很easy。
108. Convert Sorted List to Binary Search Tree
还是和arraylist一样做,不过变成从底往上做。如果我们对一个BSF 做inorder search 会返回一个sorted list。故我们也是这么做它的。
注意一个问题, list必须手动更新。因为java传的是引用,而不是指针!!! 很重要。
Java pass in Object by reference, so we cannot change head but we can change its content!!
109.Balanced Binary Tree (*)
弄清楚balanced tree的意思。
110. Path Sum
比较easy!
111. Path Sum II
和上一题思路一样。
112. Flatten Binary Tree to Linked List
采用stack做preorder search。 存一个current list的tail指针, 更新这个指针。
标准的DP。
114.Populating Next Right Pointers in Each Node
还是recrise, 注意用preorder。 root.right.next = (root.next == null ? null : root.next.left);
115. Populating Next Right Pointers in Each Node II
使用BFS做的。
116. Pascal's Triangle
没什么特别的, 就是一层一层的做就行了。 时间复杂度是O(n2)。
117. Pascal's Triangle II (*)
有特别的公式!
118. Triangle
很清晰的倒着做就行啦。
119. Best Time to Buy and Sell Stock
从后往前做,保留从最后到当前位置中最大的price的值。
120.Best Time to Buy and Sell Stock II
很easy
121. Binary Tree Maximum Path Sum
注意path开头和结尾都不见得在leaf上。
122.Valid Palindrome
去掉空格后前后比较即可。
123.Longest Consecutive Sequence
由于要保持O(n),所以每个节点最多访问一边。 所以采用边发散边删的方法,这样在遍历时就不会重复访问了。最后找出最大长度即可。很没有节操的用hashmap来做。
遍历即可。
125. Surrounded Regions
从四个边入手,把不能换成X的O标记出来,用map存。 然后再遍历这个array, 更改可以变成X的。
126.Best Time to Buy and Sell Stock III
先找到从[0, ...) 中间的最好的结果。 然后剩下的部分和Best Time to Buy and Sell Stock 方法一样。 这样就可以了。
标准的二维DP,为了加速使用一个array存储从i到j是否为palindrome。
128. Palindrome Partitioning II
这个两个Dp, 一个是对那一部分是palindrome的二维dp。 还有一个是 对cut个数的一维dp。
129. Binary Tree Preorder Traversal
采用stack来避免Recursive,先入right 再入left。
130. Binary Tree Postorder Traversal
这题好难,学习!
131. Clone Graph
以原来的node为key 建立一个hashmap, 然后遍历原图,加入新的node。
132.Gas Station
使用差值计算就行了, 注意这是一个环,所以可以以任何地方为初始点。
133.Candy
这题也是波的题目。
134.Single Number
异或的应用: x ^ x = 0
135. Single Number II
位运算的应用!注意负数!
136.Copy List with Random Pointer (*)
这个算法很值得学习
137. Word Break
1维DP。
138. Word Break II
2维DP。
139. Linked List Cycle
fast pointer
140. Linked List Cycle II
算法比较经典,值得记住!
141. Word Ladder
从图里build 一棵tree。使用BFS。
142. Word Ladder II (*)
同样的策略, 但是过不了大数据 = =
143. Reorder List
先把list均分成两段,把后半段反向,然后把两段合并。
144. LRU Cache
这题有点像OS的编程题,很有意思, hashmap + double linked list。 注意细节。 使用了一个header 既做头又做尾。
145. Insertion Sort List
新生成一个list,每次用原来的list上取一个node,然后在新的list上遍历找到能够插入的位置把它插进去。
146. Sort List
merge sort,学习!
147. Max Points on a Line
148. Evaluate Reverse Polish Notation
stack的应用,很基础。
149. N-Queens II
和N-Queens一样,而且相对而言更加简单。
150.
leetcode 整理的更多相关文章
- leetcode整理(一)
leetcode题目整理,基本上不是最优解 1. 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 ...
- [leetcode整理]
=======简单 leetcode164 Maximum Gap sort两次 =======有参考 330 Patching Array 98 Validate Binary Search Tre ...
- LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...
- Leetcode——回溯法常考算法整理
Leetcode--回溯法常考算法整理 Preface Leetcode--回溯法常考算法整理 Definition Why & When to Use Backtrakcing How to ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- [leetcode] 提醒整理之进制
12. Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be with ...
- [leetcode] 题型整理之二叉树
94. Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' va ...
- [leetcode] 题型整理之动态规划
动态规划属于技巧性比较强的题目,如果看到过原题的话,对解题很有帮助 55. Jump Game Given an array of non-negative integers, you are ini ...
随机推荐
- 理解golang中的channel
channel是goroutine之间的通信机制.可以类比线程间的通信,线程间的通信有多种方式,比如线程上下文.共享内存.IPC通信.socket实现不同机器间的通信. channel用起来很简单,绑 ...
- NUCLEO-L053R8 TIM定时器 PWM输出
TIM2 PWM输出测试 今天给大伙分享一个TIM2 PWM输出小实验. 实验开发板:Nucleo-L053R8,即STM32L053R8T6. 开发环境:MDK5 图1 - 工程界面 本次实验测试的 ...
- 如何在golang中打印grpc详细日志
最近捣鼓fabric,在一个tls证书问题上纠结挺久,连接orderer服务时候,grpc日志总是冷冰冰的显示这个信息 Orderer Client Status Code: (2) CONNECTI ...
- 链表--数据结构与算法JavaScript描述(6)
链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...
- Tips & Tricks Learned Releasing an Hybrid App Using Steroids.js
http://marcgg.com/blog/2014/04/09/phonegap-steroids-hybrid-native-app-tips/
- Hibernate怎么用
一.为什么用Hibernate? [核心:对象关系映射] Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作, 在该框架之前,数据库的操作步骤是: 1.根据连接字串获取连接 2.执行s ...
- 北京Uber优步司机奖励政策(12月9日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 通过 zxing 生成二维码
二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...
- Qt-QML-Slider-滑块-Style
感觉滑块这个东西,可以算是一个基本模块了,在我的项目中也有这个模块,今天我将学一下一下滑块的使用以及美化工作. 想学习滑块,那就要先建立一个滑块,新建工程什么的这里就省略了,不会的可以看我前面的几篇文 ...