从零开始的力扣刷题记录-第八十四天

力扣每日四题

  • 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 := v
        for 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 := 1
            for _,x := range trust{
                if x[0] == i{
                    flag = 0
                    break
                }
            }
            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 / 3
    remainder := n % 3
    if 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 := 0
    temp := 0
    re := 0
    for 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
}

总结

两道动态规划题都没有用动态规划做,明天继续动态规划

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)