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

力扣每日四题

  • LCP 66. 最小展台数量-简单
  • 598. 范围求和 II-简单
  • 506. 相对名次-简单
  • 1170. 比较字符串最小字母出现频次-中等
  • 总结

LCP 66. 最小展台数量-简单

题目描述:
力扣嘉年华将举办一系列展览活动,后勤部将负责为每场展览提供所需要的展台。
已知后勤部得到了一份需求清单,记录了近期展览所需要的展台类型, demand[i][j] 表示第 i 天展览时第 j 个展台的类型。
在满足每一天展台需求的基础上,请返回后勤部需要准备的 最小 展台数量。
注意:
同一展台在不同天中可以重复使用。

题解:
遍历需求数组,每一天都新建一个数组保存需要的展台类型,遍历完当天的展台类型后与目前需要的展台数组对比,更新需要的展台数量

代码(Go):

func minNumBooths(demand []string) int {
    re := [26]int{}
    for _,day := range demand{
        arr := [26]int{}
        for _,value := range day{
            arr[int(value) - 97]++
        }
        for i := 0;i < 26;i++{
            if arr[i] > re[i]{
                re[i] = arr[i]
            }
        }
    }
    sum := 0
    for _,v := range re{
        sum += v
    }
    return sum
}

598. 范围求和 II-简单

题目描述:
给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。

题解:
实际上只需要找出操作数组中ai的最小值和bi的最小值相乘即可得到结果,本质上就是求所有操作的交集

代码(Go):

func maxCount(m int, n int, ops [][]int) int {
    if len(ops) == 0{
        return m * n
    }
    tempi,tempj := m,n
    for _,v := range ops{
        if v[0] < tempi{
            tempi = v[0]
        }
        if v[1] < tempj{
            tempj = v[1]
        }
    }
    return tempi * tempj
}

506. 相对名次-简单

题目描述:
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:
名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。

题解:
排序后输出名词即可,前三名通过ifelse判断一下就可以了。用了计数排序,理论上是O(n)时间复杂度,但是实际执行很慢,估计是10的6次方的数太大了,遍历数组非常浪费时间导致用时比O(nlogn)的排序都要慢,看来计数排序也不能无脑用

代码(Go):

func findRelativeRanks(score []int) []string {
    arr := [1000001]int{}
    for i,v := range score{
        arr[v] = i + 1
    }
    sce := make([]string,len(score))
    temp := 1
    for i := 1000000;i >= 0;i--{
        if arr[i] != 0{
            if temp == 1{
                sce[arr[i] - 1] = "Gold Medal"
            }else if temp == 2{
                sce[arr[i] - 1] = "Silver Medal"
            }else if temp == 3{
                sce[arr[i] - 1] = "Bronze Medal"
            }else{
                sce[arr[i] - 1] = fmt.Sprintf("%d",temp)
            }
            temp++
        }
    }
    return sce
}

1170. 比较字符串最小字母出现频次-中等

题目描述:
定义一个函数 f(s),统计 s 中(按字典序比较)最小字母的出现频次 ,其中 s 是一个非空字符串。
例如,若 s = “dcce”,那么 f(s) = 2,因为字典序最小字母是 “c”,它出现了 2 次。
现在,给你两个字符串数组待查表 queries 和词汇表 words 。对于每次查询 queries[i] ,需统计 words 中满足 f(queries[i]) < f(W) 的 词的数目 ,W 表示词汇表 words 中的每个词。
请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是第 i 次查询的结果。

题解:
f(s)函数比较容易,两个变量分别记录当前最小字符和出现次数即可。由于单词长度不大于10所以可以用计数排序的思想用一个数组统计经过f函数后从0到10的数量,最后可以通过后缀和的思想从后往前更改此数组使其满足下标中存的数恰好是查询的结果,最后一一统计每次查询的结果

代码(Go):

func numSmallerByFrequency(queries []string, words []string) []int {
    queriesnum := f(queries)
    wordsnum := f(words)
    answer := make([]int,len(queries))
    temp := [11]int{}
    for _,v := range wordsnum{
        temp[v]++
    }
    for i := 9;i >= 2;i--{
        temp[i] += temp[i + 1]
    }
    for i,v := range queriesnum{
        if v >= 10{
            answer[i] = 0
        }else{
            answer[i] = temp[v + 1]
        }
    }
    return answer
}
func f(queries []string) []int{
    queriesnum := []int{}
    temp := 0
    min := 'z'
    for _,query := range queries{
        for _,v := range query{
            if v < min{
                min = v
                temp = 1
        }else if v == min{
                temp++
            }
        }
        queriesnum = append(queriesnum,temp)
        temp = 0
        min = 'z'
    }
    return queriesnum
}

总结

比较简单的一天,今天力扣官网上的每日一题是中等题,就顺手做了,做完才想起来之前说要做一道回溯练练手来着,只能下次了

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