题目剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
用例
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
解题思路
思路一:遍历数组并统计
思路二:利用二分法查找边界,左边界为第一个小于target的数,右边界为第一个大于target的数,
有一种思路是查找左右第一个等于target的数,但是由于数组中这个数不一定会出现,这会导致多出很多不必要的判断
代码
1 | class Solution { |
题目面试题 17.13.恢复空格
哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子”I reset the computer. It still didn’t boot!”已经变成了”iresetthecomputeritstilldidntboot”。
在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。
用例
输入:
dictionary = [“looked”,”just”,”like”,”her”,”brother”]
sentence = “jesslookedjustliketimherbrother”
输出: 7
解题思路
基本的动态规划思路,把出现在字典中的字符串的长度看作0,记录以某个位置i的字符为结尾可以找到的最短的字符串。
状态转移方程:dp[i] = min(dp[i],dp[j]) if (string[j:i] in dictionary)
上面的基本动态规划思路会频繁地创建字符串,导致时间消耗,因此采用一个字典树来解决频繁这个问题,还可以实现对子串的重用
代码
1 | class Solution { |
题目315.计算右侧小于当前元素的个数
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
用例
输入: [5,2,6,1]
输出: [2,1,1,0]
解题思路
思路一:归并排序,利用归并排序来求取数组的逆序对
思路二:树状数组,可以参考该博客——树状数组
树状数组适用于求解与前缀和相关的问题
代码
1 | class Solution { |
题目785.判断二分图
给定一个无向图graph,当这个图为二分图时返回true。
如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。
graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。
用例
输入: [[1,3], [0,2], [1,3], [0,2]]
输出: true
输入: [[1,2,3], [0,2], [0,1,3], [0,2]]
输出: false
解题思路
对图中的节点进行分组,一条边上的两个点要被分到不同的组,利用bfs算法进行分析,选择当前点,观察其分组,
如果还没有被分组,就分到组1,如果被分了组,就观察下个点,将该点的对面的点p2分到组2,并按照bfs算法分析
p2的对立点,如果其对立已经被分组,而且与p2同组,就返回false
代码中提供一个并查集的实现
代码
1 | class Solution { |
1 | class Solution { |
发布时间: 2020-07-04
最后更新: 2020-07-16
本文标题: leetcode-day26
本文链接: http://huangketsudou.github.io/2020/07/04/leetcode-day26/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处