leetcode刷题总结151-200
151. 翻转字符串里的单词
描述:
输入: " hello world! "
输出: "world! hello"
思路:从后往前双指针。
152. 乘积最大子数组
描述:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
思路:动态规划。dp[i][0~1]表示结尾到i 的最小值和最大值。(很可能当前的最小值*负数就成为了最大值)
153. 寻找旋转排序数组中的最小值
描述:
输入: [3,4,5,1,2]
输出: 1
思路:二分。
154. 寻找旋转排序数组中的最小值 II
描述:
输入: [2,2,2,0,1]
输出: 0
思路:二分。
155. 最小栈
描述:
思路:用一个栈实现前三个操作。另外一个栈用于存储最小元素。数量和第一个栈一样,但是不同步。
156-159 无权限。。。
160. 相交链表
描述:
思路:两个指针。A遍历完后开始从B开始,B遍历完后从A开始。A+sub(b,merge)=b+sub(a,merge)
161. 无权限。。。
162. 寻找峰值
描述:
输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。
思路:二分。当mid>mid+1,那么right=mid。否则left=mid+1
163.。。。
164. 最大间距
描述:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
思路:基数排序。
165. 比较版本号
描述;
输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
思路:双指针暴力法。
166. 分数到小数
描述:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
思路:在循环中判断当前的余数*10是否是上一个被除数
167. 两数之和 II - 输入有序数组
描述:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
思路:双指针。一个从前一个从后。
168. Excel表列名称
169. 多数元素
171. Excel表列序号
172. 阶乘后的零
173. 二叉搜索树迭代器
描述:
思路:中序遍历。
174. 地下城游戏
思路:动态规划从最后一个点开始规划。
175. 组合两个表
176. 第二高的薪水
177. 第N高的薪水
178. 分数排名
179. 最大数
180. 连续出现的数字
181. 超过经理收入的员工
182. 查找重复的电子邮箱
183. 从不订购的客户
184. 部门工资最高的员工
185. 部门工资前三高的所有员工
187. 重复的DNA序列
描述:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC", "CCCCCAAAAA"]
思路:滑动窗口l=10,hash.
188. 买卖股票的最佳时机 IV
描述:
输入: [3,2,6,5,0,3], k = 2
输出: 7
解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
思路:动态规划。dp[i第几天][j第几次交易][不卖,卖]
189. 旋转数组
描述:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
思路:对于5来说,移动3次后的位置为(4+3)%7=0,然后开始换1.。。
190. 颠倒二进制位
191. 位1的个数
192. 统计词频
193. 有效电话号码
194. 转置文件
195. 第十行
196. 删除重复的电子邮箱
197. 上升的温度
198. 打家劫舍
思路:动态规划
199. 二叉树的右视图
描述:
思路:递归遍历。先遍历右子树。当右子树为空,那么最右边看到的就是左子树的右子树。
200. 岛屿数量
描述:
思路:广度优先遍历1的节点。遍历的时候设置标志位。遍历完后继续查找1的节点继续便利。