【LeetCode】统计匹配检索规则的物品数量Java题解

47 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

题目描述

给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。

另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。

如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 :

ruleKey == "type" 且 ruleValue == typei 。 ruleKey == "color" 且 ruleValue == colori 。 ruleKey == "name" 且 ruleValue == namei 。 统计并返回 匹配检索规则的物品数量 。

示例 1:

输入:items = [["phone","blue","pixel"],["computer","silver","lenovo"],["phone","gold","iphone"]], ruleKey = "color", ruleValue = "silver"
输出:1
解释:只有一件物品匹配检索规则,这件物品是 ["computer","silver","lenovo"] 。

示例 2:

输入:items = [["phone","blue","pixel"],["computer","silver","phone"],["phone","gold","iphone"]], ruleKey = "type", ruleValue = "phone"
输出:2
解释:只有两件物品匹配检索规则,这两件物品分别是 ["phone","blue","pixel"]["phone","gold","iphone"] 。注意,["computer","silver","phone"] 未匹配检索规则。

思路分析

  • 今天的算法题目是列表类型题目。题目比较长,需要我们统计并返回 匹配检索规则的物品数量。首先分析题目,给出的 items[i] = [typei, colori, namei],是按照规定好的顺序排列的,我们可以使用一个map,将每一个分类做对应,比如:type -> 0, color -> 1,name -> 2。完成这一步map计算之后,我们继续可以直接根据给出的 ruleKey 分类,找到对应的值。然后在将获取到的值与ruleValue做比较,找出符合题目要求的数量并统计。
  • 具体实现代码如下,供参考。

通过代码

class Solution {
    public int countMatches(List<List<String>> items, String ruleKey, String ruleValue) {
        int ans = 0;
        Map<String, Integer> map = new HashMap<>();
        map.put("type", 0);
        map.put("color", 1);
        map.put("name", 2);
        Integer idx = map.get(ruleKey);
        for (List<String> item : items) {
            if (item.get(idx).equals(ruleValue)) {
                ans++;
            }
        }

        return ans;
    }
}

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 今天这个题目相对容易,主要考察的是hashMap的使用,hashMap主要采用的是空间换时间的思想,来提升我们的计算效率。这个题目一个考察的小点是包装类比较使用equals,比较的是对象的内容。
  • 坚持算法每日一题,加油!