leetcode summary-思路整理-arranged by soul’s notes

第 2 章 线性表
2.1 数组 . . . . . . . . . . . . . . . 2
2.1.1 Remove Duplicatesfrom Sorted Array . . . 2
2.1.2 Remove Duplicatesfrom Sorted Array II . . 3
2.1.3 Search in RotatedSorted Array . . . . . . 4
2.1.4 Search in RotatedSorted Array II . . . . . 5
2.1.5 Median of Two Sorted Arrays . . . . . . . . . . 6
2.1.6 Longest Consecutive Sequence . . . . . . . . 8
2.1.7 Two Sum . . . . . . . . 10

方法:hash。用一个哈希表,存储每个数对应的下标,复杂度 O(n)

2.1.8 3Sum . . . . . . . . . . 11

先排序,然后左右夹逼,复杂度 O(n^2)。此方法可推广至k-sum。

所谓左右夹逼,即最外层令a从下标begin循环至下标end-2; 然后令b为a当前位置的下一位置,c为数组最后位置。然后若此时三个数之和<target, 则令b下标++,若三个数之和>target, 则令c下标--. 代码可参考soul。

外面一个for循环,里面一个while(b < c)循环。

2.1.9 3Sum Closest . . . . . . 13

类似上题。

2.1.10 4Sum . . . . . . . . . . 14

同3sum的策略:先排序,然后左右夹逼,复杂度 O(n^3)。

外面两层for循环,里面一个while(c<d)循环。
2.1.11 Remove Element . . . . 17

设置一个index,当判断当前数不为target时才让index++;
2.1.12 Next Permutation . . . . 18

1. 从右到左,找到第一个违反递增趋势的数字,记其下标为p;

2. 从右到左,找到第一个小于p下标对应的元素值的元素,记其下标为c;

3. 将下标p和c所指元素值进行互换;

4. 在下标p位置处往右的所有元素进行reverse。

2.1.13 Permutation Sequence . 20

康托编码
2.1.14 Valid Sudoku . . . . . . 22

依次对每一行、每一列、每一个小正方形进行判断,看是否有重复元素。
2.1.15 Trapping Rain Water . . 24
2.1.16 Rotate Image . . . . . . 27

顺时针旋转90度:先沿水平线翻转,再沿主对角线翻转。

逆时针旋转90度:先沿竖直线翻转,再沿主对角线翻转。

顺时针旋转180度:水平翻转和竖直翻转各一次。 逆时针旋转180度效果同顺时针180度。

2.1.17 Plus One . . . . . . . . 28
2.1.18 Climbing Stairs . . . . . 29
2.1.19 Gray Code . . . . . . . 30
2.1.20 Set Matrix Zeroes . . . . 33

空间O(1)方法:利用第一行和第一列。

1.先确定第一行和第一列是否需要清零
2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0 (反正早晚都要对它赋0,现在赋0能起到标记作用)
3.根据第一行和第一列的信息,已经可以讲剩下的矩阵元素赋值为结果所需的值了
4.根据1中确定的状态,处理第一行和第一列。

ref:  http://fisherlei.blogspot.com/2013/01/leetcode-set-matrix-zeroes.html

2.1.21 Gas Station . . . . . . . 35

consider the case that, if started at station i, and when goes to the station j, there is not enough gas to go the j+1 station. What happened now? For thebrutal force method, we go back to the station i+1 and do the same thing. But, actually, if the accumutive gas cannot make it from j to j+1, then the stations from i to j are all not the start station.

That is because, (1)the tank is unlimited, every time arrive to the station, the tank will fuel the max gas here, and comsume the cost to go to the next. (2)There can not be negative tank when arriving a station, at least the tank is empty. So, if i to j cannot go to j+1, then i+1 to j still cannot go to j+1... In this way, the next starting station we will try is not i+1, but the j+1. And after a single loop from i to j, we can find the result!

原因很简单:tank里的油量是不可能是负数的。如果你从起点i处到j都到不了,那从i+1就更不可能到j了,因为从i到i+1后tank里可能会有些剩余的油,最差情况就是从i 到i+1后tank刚好空。如果带着剩余的油从i+1都到不了j,那以白手起家的状态从i+1出发更不可能到j了。

所以,如果从i到j的累积和为负,那i不用从i+1开始继续循环,直接跳到 处开始循环就行了。

explanation ref: http://yucoding.blogspot.com/2013/12/leetcode-question-gas-station.html

code refer to soulmachine.

2.1.22 Candy . . . . . . . . . . 35

为什么从左向右扫一次,又从右向左扫一次?

举个最简单的例子,如果ratings是5,4,3,2,1, 从左向右扫能到的candy数1,1,1,1,1,但从右向左扫能到的candy数是1,2,3,4,5。

对每个位置都取一个max。

ref: http://yucoding.blogspot.com/2014/02/leetcode-question-candy.html

2.1.23 Single Number . . . . . 37

所有数字异或一遍。
2.1.24 Single Number II . . . . 38

还是位操作。设一个32位的count数组,用来统计每一位出现的次数。如果哪一位出现的次数不是3的倍数,那就在最后算result的时候按照其权重加进去。

 1 class Solution {
 2 public:
 3     int singleNumber(vector<int>& nums) {
 4         int n = nums.size();
 5         vector<int> count(sizeof(int) * 8, 0);
 6         for (int i = 0; i < sizeof(int) * 8; i++) {
 7             for (int j = 0; j < n; j++) {
 8                 count[i] += (nums[j] >> i) & 1;
 9             }
10         }
11         int result = 0;
12         for (int i = 0; i < count.size(); i++) {
13             result += (count[i] % 3) << i;
14         }
15         return result;
16     }
17 };

2.2 单链表 . . . . . . . . . . . . . 39
2.2.1 Add Two Numbers . . . 40
2.2.2 Reverse Linked List II . 41

基本功训练。
2.2.3 Partition List . . . . . . 42

2.2.4 Remove Duplicates
from Sorted List . . . . 43
2.2.5 Remove Duplicates
from Sorted List II . . . 44
2.2.6 Rotate List . . . . . . . 45
2.2.7 Remove Nth Node
From End of List . . . . 46
2.2.8 Swap Nodes in Pairs . . 47
2.2.9 Reverse Nodes in k-Group 48
2.2.10 Copy List with Random
Pointer . . . . . . . . . 50
2.2.11 Linked List Cycle . . . . 51
2.2.12 Linked List Cycle II . . 52
2.2.13 Reorder List . . . . . . 53
2.2.14 LRU Cache . . . . . . . 54

第 3 章 字符串
3.1 Valid Palindrome . . . . . . . . 57
3.2 Implement strStr() . . . . . . . . 58
3.3 String to Integer (atoi) . . . . . 60

3.4 Add Binary . . . . . . . . . . . 61
3.5 Longest Palindromic Substring . 62
3.6 Regular Expression Matching . . 66
3.7 Wildcard Matching . . . . . . . 67
3.8 Longest Common Prefix . . . . 69
3.9 Valid Number . . . . . . . . . . 70
3.10 Integer to Roman . . . . . . . . 72
3.11 Roman to Integer . . . . . . . . 73
3.12 Count and Say . . . . . . . . . . 74
3.13 Anagrams . . . . . . . . . . . . 75
3.14 Simplify Path . . . . . . . . . . 76
3.15 Length of Last Word . . . . . . 77

第 4 章 栈和队列 
4.1 栈 . . . . . . . . . . . . . . . . 79
4.1.1 Valid Parentheses . . . . 79
4.1.2 Longest Valid Parentheses . . . . . . . . . . 80
4.1.3 Largest Rectangle in
Histogram . . . . . . . . 82
4.1.4 Evaluate Reverse Polish Notation . . . . . . . 84
4.2 队列 . . . . . . . . . . . . . . . 85

第 5 章 树
5.1 二叉树的遍历 . . . . . . . . . 86
5.1.1 Binary Tree Preorder
Traversal . . . . . . . . 86
5.1.2 Binary Tree Inorder
Traversal . . . . . . . . 88
5.1.3 Binary Tree Postorder
Traversal . . . . . . . . 90
5.1.4 Binary Tree Level Order Traversal . . . . . . 93
5.1.5 Binary Tree Level Order Traversal II . . . . . 94
5.1.6 Binary Tree Zigzag
Level Order Traversal . 96
5.1.7 Recover Binary Search
Tree . . . . . . . . . . . 98
5.1.8 Same Tree . . . . . . . 99
5.1.9 Symmetric Tree . . . . . 101
5.1.10 Balanced Binary Tree . . 102
5.1.11 Flatten Binary Tree to
Linked List . . . . . . . 103
5.1.12 Populating Next Right
Pointers in Each Node II 105
5.2 二叉树的构建 . . . . . . . . . 107
5.2.1 Construct Binary Tree
from Preorder and Inorder Traversal . . . . . 107
5.2.2 Construct Binary Tree
from Inorder and Postorder Traversal . . . . . 108
5.3 二叉查找树 . . . . . . . . . . . 109
5.3.1 Unique Binary Search Trees . . . . . . . . . . 109
5.3.2 Unique Binary Search Trees II . . . . . . . . . 110
5.3.3 Validate Binary Search Tree . . . . . . . . . . . 111
5.3.4 Convert Sorted Array to
Binary Search Tree . . . 112
5.3.5 Convert Sorted List to
Binary Search Tree . . . 113
5.4 二叉树的递归 . . . . . . . . . 115
5.4.1 Minimum Depth of Binary Tree . . . . . . . . 115
5.4.2 Maximum Depth of Binary Tree . . . . . . . . 116
5.4.3 Path Sum . . . . . . . . 117
5.4.4 Path Sum II . . . . . . . 118
5.4.5 Binary Tree Maximum Path Sum . . . . . . . . 119
5.4.6 Populating Next Right Pointers in Each Node . 120
5.4.7 Sum Root to Leaf Numbers . . . . . . . . . . . 122

第 6 章 排序
6.1 Merge Sorted Array . . . . . . . 123
6.2 Merge Two Sorted Lists . . . . . 124
6.3 Merge k Sorted Lists . . . . . . 124
6.4 Insertion Sort List . . . . . . . . 125
6.5 Sort List . . . . . . . . . . . . . 126
6.6 First Missing Positive . . . . . . 127
6.7 Sort Colors . . . . . . . . . . . 128

第 7 章 查找
7.1 Search for a Range . . . . . . . 131
7.2 Search Insert Position . . . . . . 132
7.3 Search a 2D Matrix . . . . . . . 133

第 8 章 暴力枚举法
8.1 Subsets . . . . . . . . . . . . . 135
8.2 Subsets II . . . . . . . . . . . . 138
8.3 Permutations . . . . . . . . . . 142
8.4 Permutations II . . . . . . . . . 144
8.5 Combinations . . . . . . . . . . 146
8.6 Letter Combinations of a Phone Number . . . . . . . . . . . . . 147

第 9 章 广度优先搜索
9.1 Word Ladder . . . . . . . . . . 150
9.2 Word Ladder II . . . . . . . . . 152
9.3 Surrounded Regions . . . . . . . 154

第 10 章 深度优先搜索
10.1 Palindrome Partitioning . . . . . 162
10.2 Unique Paths . . . . . . . . . . 165
10.3 Unique Paths II . . . . . . . . . 168
10.4 N-Queens . . . . . . . . . . . . 169
10.5 N-Queens II . . . . . . . . . . . 172
10.6 Restore IP Addresses . . . . . . 173
10.7 Combination Sum . . . . . . . . 174
10.8 Combination Sum II . . . . . . 175
10.9 Generate Parentheses . . . . . . 177
10.10 Sudoku Solver . . . . . . . . . 178
10.11 Word Search . . . . . . . . . . 180

第 11 章 分治法
11.1 Pow(x,n) . . . . . . . . . . . . . 185
11.2 Sqrt(x) . . . . . . . . . . . . . . 186

第 12 章 贪心法
12.1 Jump Game . . . . . . . . . . . 187
12.2 Jump Game II . . . . . . . . . . 188
12.3 Best Time to Buy and Sell Stock 190
12.4 Best Time to Buy and Sell Stock II191
12.5 Longest Substring Without Repeating Characters . . . . . . . 192
12.6 Container With Most Water . . . 193

第 13 章 动态规划
13.1 Triangle . . . . . . . . . . . . . 195
13.2 Maximum Subarray . . . . . . . 196
13.3 Palindrome Partitioning II . . . 198
13.4 Maximal Rectangle . . . . . . . 199
13.5 Best Time to Buy and Sell Stock
III . . . . . . . . . . . . . . . . 200
13.6 Interleaving String . . . . . . . 201
13.7 Scramble String . . . . . . . . . 203
13.8 Minimum Path Sum . . . . . . . 208
13.9 Edit Distance . . . . . . . . . . 210
13.10 Decode Ways . . . . . . . . . 212
13.11 Distinct Subsequences . . . . . 213
13.12 Word Break . . . . . . . . . . 214
13.13 Word Break II . . . . . . . . . 216

第 14 章 图
14.1 Clone Graph . . . . . . . . . . . 218

第 15 章 细节实现题
15.1 Reverse Integer . . . . . . . . . 221
15.2 Palindrome Number . . . . . . . 222
15.3 Insert Interval . . . . . . . . . . 223
15.4 Merge Intervals . . . . . . . . . 224
15.5 Minimum Window Substring . . 225
15.6 Multiply Strings . . . . . . . . . 227
15.7 Substring with Concatenation of All Words . . . . . . . . . . . 230
15.8 Pascal’s Triangle . . . . . . . . 231
15.9 Pascal’s Triangle II . . . . . . . 232
15.10 Spiral Matrix . . . . . . . . . . 233
15.11 Spiral Matrix II . . . . . . . . . 234
15.12 ZigZag Conversion . . . . . . 236
15.13 Divide Two Integers . . . . . . 237
15.14 Text Justification . . . . . . . . 238
15.15 Max Points on a Line . . . . . 240

时间: 2024-10-24 08:53:29

leetcode summary-思路整理-arranged by soul’s notes的相关文章

leetcode题目思路以及部分解答(一)

为了进好公司这一个多月就得抽时间刷leetcode了..感觉这个OJ很不严谨...好多边界条件都没说清处..不过还好可以推测.唯一的好处就是不用自己编译调试,可以直接在网上显示出结果.当然,复杂一点的题目为了调试自己构建题目的结构也是很麻烦的...所以我发现提交里面错误好多.....再就是在笔记本上会时不时的变卡...每次提交都得等个3,4分钟才成功.要不就502错误... 我的题目按照通过率来.从通过率最高的题目开始讲解.每题不一定是最优解,都是我想得.仅供参考. 题目标题我都标好了.可以用c

快速排序思路整理

引言: 快速排序和归并排序是面试当中常常被问到的两种排序算法,在研究过数据结构所有的排序算法后,个人认为最复杂的当属快速排序.从代码量上来看,快速排序并不多,我之所以认为快排难以掌握是因为快排是一种递归算法,同时终止条件较多.如果你刚刚把快排的思路整理过一遍可能觉得不难,然而一个月之后呢? 面试要求的是临场发挥,如果不是烂熟于心,基本就卡壳了.在面试官眼里,你和那些完全不懂快速排序算法的菜逼是一样的,也许实际上你可能私底下已经理解很多遍了,然而并没卵.所以当下问题就是,如何将快排烂熟于心?我觉得

leetcode题目思路以及部分解答(二)

又刷了30题了,这速度还不错.因为还有别的东西要复习,所以进度并不快.感觉还是能学到很多新东西的.早知道这个就不用去其他地方刷了.这个难度不高,还可以知道哪些情况没考虑.比其他OJ那种封闭式的好多了.还是进入正题吧. 1.Rotate Image 这个做过两三次了,但每次还是得重新开始推导..这次又推导了很久..不过好在做过,代码也写得比较简洁. 主要思路就是第一层循环按层次深入.第二层把旋转后对应替代的4个位置循环更新.swap就是用来更新用的.做完发现讨论里的最高票代码就是我这样子= =  

搜索与排名思路整理

学习<集体智慧编程>第4章的思路整理: 本章的主要内容就是建立一个模拟的全文搜索引擎,主要的大步骤为:1.检索网页,2.建立索引,3.对网页进行搜索 4.多种方式对搜索结果进行排名 一.检索网页:主要利用python写了一个爬虫软件,通过爬取一个网站上链接来不断的扩充爬取的内容.主要利用了python的urllib库和BeautifulSoup库.这部分比较简单,核心代码如下: def crawl(self,pages,depth=2): for i in range(depth): newp

16 飞机大战:思路整理、重要代码

思路整理 重要代码 0.重写方法万万检查记得要不要继承父类方法 def __init__(self): super().__init__() 1.创建游戏时钟:用来设置游戏刷新率 # 新建游戏时钟对象 self.clock = pygame.time.Clock() ... ... # 设置游戏刷新率 self.clock.tick(60) #60帧/s 2.精灵组 # 创建xx精灵 self.xx = Xx() #其中Xx是Xx类 # 创建xx精灵组 self.xx_group = pygam

LeetCode解题思路:627. Swap Salary

Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m values (i.e., change all f values to m and vice versa) with a single update query and no intermediate temp table. For example: | id | name | sex | sala

能力库开发思路整理

能力库界面如下: 相关数据库表: 1 CREATE TABLE `base_ability` ( 2 `abillty_id` varchar(36) NOT NULL DEFAULT '' COMMENT '主键', 3 `ability_code` varchar(20) DEFAULT NULL, 4 `ability_name` varchar(20) DEFAULT NULL COMMENT '能力编号', 5 `ability_name_desc` varchar(255) DEFA

LeetCode解题思路:476. Number Complement

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation. Note: The given integer is guaranteed to fit within the range of a 32-bit signed integer. You could assume no leading ze

LeetCode -- Summary Ranges

题目描述: Given a sorted integer array without duplicates, return the summary of its ranges. For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"]. Credits:Special thanks to @jianchao.li.fighter for adding this probl