「Leetcode - 算法_Mid781」Map_森林中的兔子

力扣四月第一周

4.四、Mid 781 森里的兔子

森林中,每一个兔子都有颜色。其中一些兔子(多是所有)告诉你还有多少其余的兔子和本身有相同的颜色。咱们将这些回答放在 answers 数组里。java

返回森林中兔子的最少数量.数组

踩完坑完之后给出题目翻译:测试

有一堆兔子,随机点兔子,点中后返回给你与这只兔子颜色相同的兔子数(不包括这只兔子自己),不必定会点全部的。根据兔子给的返回结果,得出 最少有多少只兔子。翻译

试错

这题描述挺绕的,个人第一反应是使用 bitSet 存兔子同颜色的个数值,有相同的就跳过,没有相同的就直接向结果加上 同色个数加上该兔子 获得 这种颜色的兔子个数code

记录一下这种思路下踩坑的经历rem

试错代码1、

class Solution {
    public int numRabbits(int[] answers) {
        int result = 0;
        
        if (answers.length == 0) {
            return result;
        }

        BitSet set = new BitSet();
        int temp;
        
      for (int i = 0 ; i < answers.length ; ++i) {
            temp = answers[i];
            if (!set.get(temp)) {
                set.set(temp);
                result += temp + 1; 
            }
        }

        return result;
    }
}

自信回车,可是报错了。文档

此时测试用例是 [1,0,0,0,1] 很容易找出漏洞,这里是属于逻辑错误,漏掉了 重复出现的 0,这里的逻辑是有问题的。get

简单修补以后(line12 以后的for循环加限制条件)源码

试错代码2、

class Solution {
    public int numRabbits(int[] answers) {
        int result = 0;
        
        if (answers.length == 0) {
            return result;
        }

        BitSet set = new BitSet();
        int temp;
        for (int i = 0 ; i < answers.length ; ++i) {
            temp = answers[i];
            if (temp == 0) {
                ++result;
                continue;
            }            

            if (!set.get(temp)) {
                set.set(temp);
                result += temp + 1; 
            }
        }

        return result;
    }
}

试错结论

这里也是错,最后一个测试例是 [0,0,1,1,1],一下愣住了,这儿有点考对题目的理解,测试 [2,2,0,0,2]能够经过,才发现这道题目是不能用 bitSet 的。博客

bitSet 在时间、空间上都有优点,在这种须要记录(额外信息)重复出现次数的题目中是不能适用的。

使用 Map 正确解题

由于基础差,这里现学一下 MapAPI

一、HashMap的底层也是两个hashSet 经过 hash映射存储

二、简单使用

添加 解释
put(K key, V value) 添加单个键值对
putAll(Map<? extends K,? extends V> m) 添加一整张 Map 进来,至关于遍历并 put
删除
remove(Object key) 根据 key 清除映射 会返回 value 不存在则返回 null
clear()
获取
get(Object key) 返回<V>
判断 都返回 boolean
containsKey(Object key)
containsValue(Object value)
isEmpty()

上表使用 utool - Java8中文文档 + IDEA 源码阅读 制成

只为解题 浅尝辄止

修改 辅助结构为 hashMap ,改正对应的逻辑关系

特此说明:写重复代码并不是本意

为了便于观看 留下完整的 if-else 选择分支供参考

1、

class Solution {
    public int numRabbits(int[] answers) {
        int result = 0;
        
        if (answers.length == 0) {
            return result;
        }

        Map<Integer, Integer> map = new HashMap<>();
        int temp, times;
        
        for (int i = 0 ; i < answers.length ; ++i) {
            temp = answers[i];
            // 节约查询次数
            if (temp == 0) {
                ++result;
                continue;
            }            
            
            if (map.containsKey(temp)) {
                times = map.get(temp);
                // 0 1 2 2
                if (times < temp) {
                    map.put(temp, ++times);
                    
                } else {
                    map.put(temp, 0);
                    result += ++temp;
                }
            } else {
                map.put(temp, 0);
                result += ++temp;
            }
        }
        return result;
    }
}

2、提交版本

class Solution {
    public int numRabbits(int[] answers) {
        int result = 0;
        
        if (answers.length == 0) {
            return result;
        }

        Map<Integer, Integer> map = new HashMap<>();
        int temp, times;
        
        for (int i = 0 ; i < answers.length ; ++i) {
            temp = answers[i];
            // 节约查询次数
            if (temp == 0) {
                ++result;
                continue;
            }            
            
            if (map.containsKey(temp)) {
                times = map.get(temp);
                // 0 1 2 2
                if (times < temp) {
                    map.put(temp, ++times);
                    continue;
                }
            }

            map.put(temp, 0);
            result += ++temp;
        }
        return result;
    }
}

战报

image-20210404231957304

本博客为笔者原创,请不要随意转载

相关文章
相关标签/搜索