题目895.最大频率栈
实现 FreqStack,模拟类似栈的数据结构的操作的一个类。
FreqStack 有两个函数:
- push(int x),将整数 x 推入栈中。
- pop(),它移除并返回栈中出现最频繁的元素。
- 如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
解题思想
思路一:利用最大堆
思路二:维护最大的频率的栈
代码
1 | class Peer { |
1 | class FreqStack { |
题目95.不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
测试用例
输入:3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解题思路
dfs遍历,遍历返回的结果为以当前i为根节点的全部可能的子树,这些可能的子树就是由左右子树的排列构成的集合
代码
1 | class TreeNode { |
题目167.两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
测试用例
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解题思路
利用有序列表的性质,采用左右双指针进行寻找
代码
1 | class Solution { |
题目312.戳气球
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。
求所能获得硬币的最大数量。
说明:
你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
测试用例
输入: [3,1,5,8]
输出: 167
解题思路
逆向思维,戳破气球反过相当于在某个位置插入一个气球,定义dp状态为dp[i][j]为在开区间(i,j)插入一个气球能够得到的最多硬币,
dp[i][j] = max(val[i]val[k]val[j]+dp[i][k]+dp[k][j],dp[i][j]) i<j,k为插入位置,对于一个固定的i,j,需要遍历所有的k
dp[i][j] = 0 i>=j
代码
1 | class Solution { |
题目97.交错字符串
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
测试用例
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出:true
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出:false
解题思路
dp[i][j]表示a字符串位置为i,b字符串位置为j,target字符串位置为i+j-1能否匹配
代码
1 | class Solution { |
发布时间: 2020-07-20
最后更新: 2020-07-22
本文标题: leetcode-day28
本文链接: http://huangketsudou.github.io/2020/07/20/leetcode-day28/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处