1.Two Sum

构造Comparator,KSum 这一类的问题最基本的一题, 解法:

先sort,然后双指针,头尾各一个。进行加逼找值。

对于其余的KSum最终是降次到2次。 如3Sum固定一个,然后找另外两个。 4Sum两两一组然后在对pair进行操作。

2.Median of Two Sorted Arrays

二分查找的应用。

二分查找的结果肯定是start > end。注意分的两个区间是 start, mid -1 和 mid + 1, end。

这里的话每次只能减少某个array长度的一半。

3. Longest Substring Without Repeating Characters

桶排序应用。存放某char在string中的位置。不要忘记了最后还有一次比较。

4.Add Two Numbers

通过巧妙的复用carry 可以明显降低代码长度。

5.Longest Palindromic Substring

可以将长度为奇数的substring 和 偶数substring 归并到一起。 即使用两倍长度进行循环。 如果是点 则以为中心, 如果是中间,则以两边的点为中心。

6.ZigZag Conversion

找规律。。。

7.Reverse Integer

8.String to Integer (atoi)

这题真心不难,只是要弄清楚存在的test case。

9.Palindrome Number

这题貌似没什么别的解法了,就是取值进行比较即可。

10.Regular Expression Matching(*)

有待研究。。

11.Container With Most Water

为什么双指针能够得到最优解?

12.Integer to Roman  Roman to Integer

没啥特别的

13.Longest Common Prefix

顺序比就行了。

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

使用头指针会使得问题变得更加简单化。链表的题一定要使用头指针!

19.Valid Parentheses

Parentheses这一类的题目都是用stack来做的。

20.Generate Parentheses

一样的, 每一步可以加'(' or ')'。 ')'只有在还有'(' 没有匹配完的情况下才能加。

21.Merge k Sorted Lists

考虑下如何只使用constant的extra space 来做。

22.Swap Nodes in Pairs

指针的操作,考虑下停止条件和 奇数偶数的情况即可。

23.Reverse Nodes in k-Group(*)

it is the same question as reverse linked list. Solved!

24.Remove Duplicates from Sorted Array

这个方法记下来。

25.Remove Element

和上一题一样。

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的, 用这一部分来进行判断。

32.Search for a Range

一次找左边界 一次找右边界。 其实也是二分。

33.Search Insert Position

采用二分,加快速度。

34.Valid Sudoku

很简单。

35.Sudoku Solver

典型的迭代算法。未找到加速的方法。

36.Count and Say

一层一层的产生就行啦。

37.Combination Sum

排序的方法。 1. 对原始array排序 2.去重 3.再选取的数字必定不小于之前的数字。

38.Combination Sum II

这里只比上一题改了一点,不能去重,而是要求在同一个位置上 不能取同样的数字。

39.First Missing Positive

就是桶排序,只不过不许用额外空间。

40.Trapping Rain Water

这题也是波的那类题, 从左到右算一遍, 从右到左再算一遍。

41.Multiply Strings

利用integer array可以简化计算! 很方便!

42.Wildcard Matching (*)

43.Jump Game

存当前位置能到的最远长度即可, 如果长度不小于0,则可以。

44.Jump Game II (*)

只能采用greedy做,依旧贪心去推,贪心的规则就是在能够到达的范围之内,选择一个能够到达最远距离的点,更新步数,和更新最远到达的范围。

45.Permutations

就是递归。。

46.Permutations II

和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.

52.Maximum Subarray

很好的算法。

53.Spiral Matrix

也是一个排序的问题,没有特殊的。

54.Merge Intervals

先把interval 按start time 排序,再添加。 保存当前的最大end time。

55.Insert Interval

和上一题做法一模一样。

56.Length of Last Word

这题很简单,但是要注意,string 后面可能有连续的空格,which is meaningless。

57.Spiral Matrix II

same, 也就是一个顺序的问题,注意n的单复数。

58.Permutation Sequence

算法很简单,但是写出来还是有难度的。

59.Rotate List

首先从head开始跑,直到最后一个节点,这时可以得出链表长度len。然后将尾指针指向头指针,将整个圈连起来,接着往前跑len – k%len,从这里断开,就是要求的结果了

60.Unique Paths

非常easy的dp。

61.Unique Paths II

加上一个对obstacle的判断即可。

62.Minimum Path Sum

和上面一样,只是每一步时取最小长度。

63.Merge Two Sorted Lists

需要考虑哪个list先完。

64.Add Binary

可以使用位运算。 ^ 异或。

65.Valid Number

boring, 要考虑太多case。

66.Plus One

so easy

67.Text Justification

68.Sqrt(x)

使用二分来做。

69. Climbing Stairs

最base 的迭代。

70.Simplify Path

利用堆的性质做就行了。 主要注意. 和 .. 的作用

71. Edit Distance

好题! DP的好题。

72.Set Matrix Zeroes

关键在于复用现在的matrix 来存储需要变0的行列的信息。

找到哪些地方要设为0很容易,但是注意当变0的时候一定要注意顺序,不要后面又check之前改过的值,这样会把全部都变成0。

73. Search a 2D Matrix

使用两次二分来加速。 一次是找到不大于target的col= 0的最值, 第二遍遍历这一row 然后找target。 如果找不到 就return false。

74. Sort Colors

使用双指针来做, 左右各有一个指针来说明边界。

75. Minimum Window Substring

注意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的应用。 很巧妙

84. Maximal Rectangle

先降成1维, 然后在递归到二维。 和find maximum subarray 升维到 find maximum submatrix解法一样。

85. Partition List

就在原来链表上修改。 将大于target的数字放到原来list的tail处。 动态的维护一个边界即可。

86. Scramble String

用DP来做,从顶往下走,一定在某一部能发现 s1 的左子树 等于 s2的右子树, s1的右子树 等于 s2的左子树。

87. Merge Sorted Array

从后往前做,注意判断的条件。

88. Gray Code

基于原来的代码进行扩充的,只是注意在扩充的时候需要反序(mirror),然后再乘上2的乘方即可。

89.Decode Ways

从前往后做,这样更简单。 典型的DP, matrix[i + 1] = matrix[i] + matrix[i - 1]

90. Reverse Linked List II (*)

注意链表的操作。

91.Restore IP Addresses

注意高位不能为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指针, 更新这个指针。

113. Distinct Subsequences

标准的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来做。

124. Sum Root to Leaf Numbers

遍历即可。

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 方法一样。 这样就可以了。

127.Palindrome Partitioning

标准的二维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 整理的更多相关文章

  1. leetcode整理(一)

    leetcode题目整理,基本上不是最优解 1. 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 ...

  2. [leetcode整理]

    =======简单 leetcode164 Maximum Gap sort两次 =======有参考 330 Patching Array 98 Validate Binary Search Tre ...

  3. LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

    作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...

  4. Leetcode——回溯法常考算法整理

    Leetcode--回溯法常考算法整理 Preface Leetcode--回溯法常考算法整理 Definition Why & When to Use Backtrakcing How to ...

  5. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  6. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  7. [leetcode] 提醒整理之进制

    12. Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be with ...

  8. [leetcode] 题型整理之二叉树

    94. Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' va ...

  9. [leetcode] 题型整理之动态规划

    动态规划属于技巧性比较强的题目,如果看到过原题的话,对解题很有帮助 55. Jump Game Given an array of non-negative integers, you are ini ...

随机推荐

  1. 理解golang中的channel

    channel是goroutine之间的通信机制.可以类比线程间的通信,线程间的通信有多种方式,比如线程上下文.共享内存.IPC通信.socket实现不同机器间的通信. channel用起来很简单,绑 ...

  2. NUCLEO-L053R8 TIM定时器 PWM输出

    TIM2 PWM输出测试 今天给大伙分享一个TIM2 PWM输出小实验. 实验开发板:Nucleo-L053R8,即STM32L053R8T6. 开发环境:MDK5 图1 - 工程界面 本次实验测试的 ...

  3. 如何在golang中打印grpc详细日志

    最近捣鼓fabric,在一个tls证书问题上纠结挺久,连接orderer服务时候,grpc日志总是冷冰冰的显示这个信息 Orderer Client Status Code: (2) CONNECTI ...

  4. 链表--数据结构与算法JavaScript描述(6)

    链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...

  5. Tips & Tricks Learned Releasing an Hybrid App Using Steroids.js

    http://marcgg.com/blog/2014/04/09/phonegap-steroids-hybrid-native-app-tips/

  6. Hibernate怎么用

    一.为什么用Hibernate? [核心:对象关系映射] Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作, 在该框架之前,数据库的操作步骤是: 1.根据连接字串获取连接 2.执行s ...

  7. 北京Uber优步司机奖励政策(12月9日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  9. 通过 zxing 生成二维码

    二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...

  10. Qt-QML-Slider-滑块-Style

    感觉滑块这个东西,可以算是一个基本模块了,在我的项目中也有这个模块,今天我将学一下一下滑块的使用以及美化工作. 想学习滑块,那就要先建立一个滑块,新建工程什么的这里就省略了,不会的可以看我前面的几篇文 ...