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

力扣每日四题

  • 1773. 统计匹配检索规则的物品数量-简单
  • 2144. 打折购买糖果的最小开销-简单
  • 1207. 独一无二的出现次数-简单
  • 852. 山脉数组的峰顶索引-中等
  • 总结

1773. 统计匹配检索规则的物品数量-简单

题目描述:
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。
另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。
如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 :
ruleKey == “type” 且 ruleValue == typei 。
ruleKey == “color” 且 ruleValue == colori 。
ruleKey == “name” 且 ruleValue == namei 。
统计并返回 匹配检索规则的物品数量 。

题解:
根据三种情况取不同的索引进行对比即可

代码(Go):

func countMatches(items [][]string, ruleKey, ruleValue string) (ans int) {
    search := map[string]int{"type": 0, "color": 1, "name": 2}
    num := search[ruleKey]
    for _, v := range items {
        if v[num] == ruleValue {
            ans++
        }
    }
    return
}

2144. 打折购买糖果的最小开销-简单

题目描述:
一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。
免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。
比方说,总共有 4 个糖果,价格分别为 1 ,2 ,3 和 4 ,一位顾客买了价格为 2 和 3 的糖果,那么他可以免费获得价格为 1 的糖果,但不能获得价格为 4 的糖果。
给你一个下标从 0 开始的整数数组 cost ,其中 cost[i] 表示第 i 个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。

题解:
永远买最大的两个免费拿第三大的那个就可以了,先计数排序再用一个变量记录这一轮已经买了几个糖果,到2个就跳过下一个

代码(Go):

func minimumCost(cost []int) int {
    arr := [101]int{}
    for _,v := range cost{
        arr[v]++
    }
    flag := 0
    sum := 0
    for i := 100;i > 0;i--{
        temp := arr[i]
        for temp != 0{
            if flag != 2{
                sum += i
                temp--
                flag++
            }else{
                temp--
                flag = 0
            }
        }
    }
    return sum
}

1207. 独一无二的出现次数-简单

题目描述:
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

题解:
两次哈希即可,一次统计出现次数,一次判断次数是否有重复

代码(Go):

func uniqueOccurrences(arr []int) bool {
    arrnum := [2001]int{}
    for _,v := range arr{
        arrnum[v + 1000]++
    }
    dec := [1001]int{}
    for _,v := range arrnum{
        if v != 0{
            if dec[v] != 0{
                return false
            }else{
                dec[v]++
            }
        }
    }
    return true
}

852. 山脉数组的峰顶索引-中等

题目描述:
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。
你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

题解:
既然说了时间复杂度O(logn)那就肯定是二分法了,只需要在正常二分法的基础上增加一下判断条件就可以了

代码(Go):

func peakIndexInMountainArray(arr []int) int {
    l := 0
    r := len(arr)
    mid := (l + r)/2
    for l < r{
        if arr[mid + 1] > arr[mid]{
            l = mid + 1
            mid = (l + r)/2
        }else if arr[mid - 1] > arr[mid]{
            r = mid - 1
            mid = (l + r)/2
        }else{
            return mid
        }
    }
    return mid
}

总结

今天这中等题有点水,感觉可以降级成简单题了已经

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