「Leetcode - 算法_Mid781」Map_森林中的兔子
力扣四月第一周
4.4、Mid 781 森里的兔子
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量.
踩完坑完以后给出题目翻译:
有一堆兔子,随机点兔子,点中后返回给你与这只兔子颜色相同的兔子数(不包括这只兔子本身),不一定会点所有的。根据兔子给的返回结果,得出 最少有多少只兔子。
试错
这题描述挺绕的,我的第一反应是使用 bitSet 存兔子同颜色的个数值,有相同的就跳过,没有相同的就直接向结果加上 同色个数加上该兔子 得到 这种颜色的兔子个数。
记录一下这种思路下踩坑的经历
试错代码一、
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,这里的逻辑是有问题的。
简单修补之后(
line12之后的for循环加限制条件)
试错代码二、
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 正确解题
Map的几种常用 API
| 添加 | 解释 |
|---|---|
| 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() |
修改 辅助结构为 hashMap ,改正对应的逻辑关系
特此说明:写重复代码并非本意
为了便于观看 留下完整的
if-else选择分支供参考
初版代码
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;
}
}
简化重复代码版本
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;
}
}
执行结果


浙公网安备 33010602011771号