「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

本博客爲筆者原創,請不要隨意轉載

相關文章
相關標籤/搜索