力扣每日四题
- 1002. 查找共用字符-简单
- 997. 找到小镇的法官-简单
- 343. 整数拆分-中等
- 1024. 视频拼接-中等
- 总结
1002. 查找共用字符-简单
题目描述:
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
题解:
使用一个数组记录各字符出现的最少次数即可
代码(Go):
func commonChars(words []string) []string {num := [26]int{}for i,_ := range num{num[i] = 100}for _,v := range words{tempnum := [26]int{}for _,b := range v{tempnum[int(b - 'a')]++}for i,v := range tempnum{if v < num[i]{num[i] = v}}}re := []string{}for i,v := range num{temp := vfor temp > 0{re = append(re,string('a' + i))temp--}}return re
}
997. 找到小镇的法官-简单
题目描述:
小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。
如果小镇法官真的存在,那么:
小镇法官不会信任任何人。
每个人(除了小镇法官)都信任这位小镇法官。
只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。
如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。
题解:
先统计所有人被信任的次数,再查看被信任次数为n-1的人是否信任别人。看官方题解才发现这是个图的出度入度问题,只需要统计一下出度入度就可以了
代码(Go):
func findJudge(n int, trust [][]int) int {if n == 1{return 1}num := make([]int,n + 1)for _,v := range trust{num[v[1]]++}for i,v := range num{if v == n - 1{flag := 1for _,x := range trust{if x[0] == i{flag = 0break}}if flag == 1{return i}}}return -1
}
343. 整数拆分-中等
题目描述:
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
题解:
这个题我记得好像是去年笔试做过的原题,可以用动态规划做,但实际上只要尽可能的拆出3来就可以了,最后如果剩1就与一个3合起来乘4,剩2就乘2即可
代码(Go):
func integerBreak(n int) int {if n <= 3 {return n - 1}quotient := n / 3remainder := n % 3if remainder == 0 {return int(math.Pow(3, float64(quotient)))} else if remainder == 1 {return int(math.Pow(3, float64(quotient - 1))) * 4}return int(math.Pow(3, float64(quotient))) * 2
}
1024. 视频拼接-中等
题目描述:
你将会获得一系列视频片段,这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
使用数组 clips 描述所有的视频片段,其中 clips[i] = [starti, endi] 表示:某个视频片段开始于 starti 并于 endi 结束。
甚至可以对这些片段自由地再剪辑:
例如,片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。
我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, time])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。
题解:
和之前能否跳到终点的题本质上是一样的,可以先通过建立一个数组保存每个start点能到达的最远距离,这个题就完全转换成了能否跳到终点的问题,通过维护一个最远距离,计算小于当前最远距离的最大距离,当i到达当前最远距离时,片段数量加一并更改最远距离,若max>=time说明可以到达
代码(Go):
func videoStitching(clips [][]int, time int) int {maxtime := make([]int,time + 1)for _,v := range clips{if v[0] < time && maxtime[v[0]] < v[1]{maxtime[v[0]] = v[1]}}max := 0temp := 0re := 0for i := 0;i <= max;i++{if maxtime[i] > temp{temp = maxtime[i]}if i == max{re++max = temp}if max >= time{return re}}return -1
}
总结
两道动态规划题都没有用动态规划做,明天继续动态规划