从零开始的力扣刷题记录-第五十二天

力扣每日四题

  • 717. 1 比特与 2 比特字符-简单
  • LCS 02. 完成一半题目-简单
  • LCP 55. 采集果实-简单
  • 剑指 Offer 47. 礼物的最大价值-中等
  • 总结

717. 1 比特与 2 比特字符-简单

题目描述:
有两种特殊字符:
第一种字符可以用一比特 0 表示
第二种字符可以用两比特(10 或 11)表示
给你一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一个一比特字符,则返回 true 。

题解:
正序遍历遇见1走两步遇见0走一步,判断一下能不能走到最后一步即可

代码(Go):

func isOneBitCharacter(bits []int) bool {
    for i := 0;i < len(bits);i++{
        if bits[i] == 1{
            i++
        }else if i == len(bits) - 1{
            return true
        }
    }
    return false
}

LCS 02. 完成一半题目-简单

题目描述:
有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。
若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。

题解:
两次计数排序即可,一次统计各题目出现次数,一次对出现次数进行排序,最后倒序遍历排序后的数组,优先做出现次数多的题,统计次数返回

代码(Go):

func halfQuestions(questions []int) int {
    l := len(questions)
    arr := [1001]int{}
    for _,v := range questions{
        arr[v]++
    }
    arrnum := [100001]int{}
    for _,v := range arr{
        if v != 0{
            arrnum[v]++
        }
    }
    sum := l/2
    re := 0
    for i := len(arrnum) - 1;i >= 0;i--{
        temp := arrnum[i]
        for temp > 0 && sum > 0{
            sum -= i
            re++
            temp--
        }
    }
    return re
}

LCP 55. 采集果实-简单

题目描述:
欢迎各位勇者来到力扣新手村,本次训练内容为「采集果实」。
在新手村中,各位勇者需要采集一些果实来制作药剂。time[i] 表示勇者每次采集 1~limit 颗第 i 种类型的果实需要的时间(即每次最多可以采集 limit 颗果实)。
当前勇者需要完成「采集若干批果实」的任务, fruits[j] = [type, num] 表示第 j 批需要采集 num 颗 type 类型的果实。采集规则如下:
按 fruits 给定的顺序依次采集每一批次
采集完当前批次的果实才能开始采集下一批次
勇者完成当前批次的采集后将清空背包(即多余的果实将清空)
请计算并返回勇者完成采集任务最少需要的时间。

题解:
只需按照题目描述模拟即可

代码(Go):

func getMinimumTime(time []int, fruits [][]int, limit int) int {
    sum := 0
    for _,v := range fruits{
        temp := v[1]
        for temp > 0{
            sum += time[v[0]]
            temp -= limit
        }
    }
    return sum
}

剑指 Offer 47. 礼物的最大价值-中等

题目描述:
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

题解:
动态规划,因为每次只能向右或下移动,反过来想就是每次只能接收左或上来的路线,那么只需要在这两条路线之中选择礼物价值最大的路线即可,通过for循环从左至右从下至上遍历整个棋盘之后,最右下角的值就是求得的解

代码(Go):

func maxValue(grid [][]int) int {
    for i := 0;i < len(grid);i++{
        for j := 0;j < len(grid[0]);j++{
            if i > 0 && j > 0{
                grid[i][j] += max(grid[i - 1][j],grid[i][j - 1])
            }else if i > 0{
                grid[i][j] += grid[i - 1][j]
            }else if j > 0{
                grid[i][j] += grid[i][j - 1]
            }
        }
    }
    return grid[len(grid) - 1][len(grid[0]) - 1]
}

func max(x int,y int) int {
    if x > y{
        return x
    }
    return y
}

总结

现在动态规划已经初窥门径了,明天准备尝试一下回溯的题

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