leetcode刷题总结301-350
Posted dhname
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题总结301-350相关的知识,希望对你有一定的参考价值。
301. 删除无效的括号
描述:
思路:遍历。通过BFS遍历,因为BFS可以立马判断当前是否为最短修改的有效符号,之后不用再进行下一层。
303. 区域和检索 - 数组不可变
描述:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
思路:开辟一个新数组存储0-i的和,然后0-j减去0-(i-1)为i-j的和
304. 二维区域和检索 - 矩阵不可变
描述:
思路:类同。
306. 累加数
描述:
输入: "199100199"
输出: true
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
思路:遍历+回溯。
307. 区域和检索 - 数组可修改
描述:
思路:线段树。先维护一个线段树。从叶子节点往根节点进行更新。
309. 最佳买卖股票时机含冷冻期
描述:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
思路:动态规划。dp[i][k][state],第i天第k次交易当前处于买入卖出冷冻期的最大收益
310. 最小高度树
描述:
思路:BFS效率太低。首先找到叶子节点,然后逐渐修建图,也就是剪掉叶子节点,知道图剩余两个或者1个。
312. 戳气球
描述:
输入: [3,1,5,8]
输出: 167
解释: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167
思路:动态规划。dp[i][j]表示从i剪刀j的最大数字。i~k~j。从右下开始,最后求左上。
315. 计算右侧小于当前元素的个数
描述:
输入: [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1).
2 的右侧仅有 1 个更小的元素 (1).
6 的右侧有 1 个更小的元素 (1).
1 的右侧有 0 个更小的元素.
思路:从右往左构建二叉排序数。然后遍历。从根节点开始,若在右子树,那么计算左子树的个数,然后继续右子树查找,个数逐渐累积;;;;或者插入排序,插入位置寻找时通过二分,可以nlogn。
316. 去除重复字母
描述:
思路:先统计每个数字出现的次数。然后通过栈,只要重复的数字不是最后一个,就往出弹,其目标是找到最小的那个字符出现。
318. 最大单词长度乘积
描述:
输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "xtfn"。
思路:双重判断。用过set完成字符是否包含。
321. 拼接最大数
描述
输入:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
输出:
[9, 8, 6, 5, 3]
思路:对k进行不同的划分,然后分而治之,对num1,num2分别求最大数,然后归并。求最大。
在对nums求k-i的子序列使其最大的时候,需要用到栈。当栈顶元素小于下一个元素(需要丢弃元素的个数逐渐递减,需要判断>0),弹出栈顶元素同时压入新的元素。
322. 零钱兑换
描述;
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
思路:贪心+乘法代替加法快速+回溯。(贪心:先用最大的面值,5*10》5+5+5+5.。。)
324. 摆动排序 II
描述:
思路:找到排序后的中位数。不需要保证前面有序,后面有序。因此可以通过3分的快排,求出中位数。前面拿一个元素,后面那一个逐渐合并即可。
328. 奇偶链表
描述:
思路:三个节点,交替。
329. 矩阵中的最长递增路径
描述:
思路:开辟要给cache.存储【i】【j】的最长递增路径。当某个元素山下左右都大于他,那么词位置为1.然后遍历,cache用于记录并返回已经存下的数字即可。
331. 验证二叉树的前序序列化
描述:
思路:从根节点开始检验左子树右子树是否为空,不空继续判断。
332. 重新安排行程
描述:
思路:深度优先,深度优先的时候需要判断相近节点的最小字母。
334. 递增的三元子序列
描述;
思路:给定两个指针,用于存储当前元素下,第一小和第二小的元素,如果半路满足了递增,那么直接true.
336. 回文对
描述:
输入: ["abcd","dcba","lls","s","sssll"]
输出: [[0,1],[1,0],[3,2],[2,4]]
解释: 可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]
思路:先按照输入反序存储trie。然后遍历。
337. 打家劫舍 III、
描述:
思路:dp[i][0/1]存储当前元素偷/不偷的最大值。从叶子节点开始。
338. 比特位计数
描述:
思路:判断下表是否为偶数,偶数右移等于dp【i>>1】的值。否则等于+1.
341. 扁平化嵌套列表迭代器
描述:
思路:通过判断当前是否为列表继续深层次的迭代知道获取元素。
343. 整数拆分
描述:
思路:动态规划。通过dp[i]=max(dp[i], max (j*dp[i-j] , j*(i-j) ) )
347. 前 K 个高频元素
描述:
思路:x先hashmap计数。然后维护一个K大小的小顶堆。来一个元素入堆,如果>k,那么弹出一个堆的元素,知道遍历完。
以上是关于leetcode刷题总结301-350的主要内容,如果未能解决你的问题,请参考以下文章