สมมติว่าในป่า กระต่ายแต่ละตัวมีสีอยู่บ้าง ตอนนี้กระต่ายบางชุด (อาจทั้งหมด) จะบอกเราว่ากระต่ายตัวอื่นๆ มีสีเหมือนกันกี่ตัว คำตอบเหล่านั้นจะอยู่ในอาร์เรย์ เราต้องหาจำนวนกระต่ายขั้นต่ำที่สามารถอยู่ในป่าได้ ดังนั้นหากอินพุตเป็น [1,1,2] ผลลัพธ์จะเป็น 5 เนื่องจากกระต่ายสองตัวที่ตอบว่า "1" ซึ่งทั้งคู่อาจมีสีเดียวกัน ให้พูดว่า สีขาว ตอนนี้กระต่ายกว่าตอบว่า "2" สีขาวไม่ได้ มิฉะนั้นคำตอบจะไม่สอดคล้องกัน สมมติว่ากระต่ายที่ตอบว่า "2" เป็นสีดำ จากนั้นควรมีกระต่ายสีดำอีก 2 ตัวในป่าที่ไม่ตอบในแถว ดังนั้นจำนวนกระต่ายที่น้อยที่สุดในป่าคือ 5:3 ที่ตอบบวก 2 ที่ไม่ได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างแผนที่ m และ n :=ขนาดของอาร์เรย์ ans
- ตั้งค่า ret เป็น 0
- สำหรับ i ในช่วง 0 ถึง n – 1
- x :=ans[i]
- ถ้า x =0 ให้เพิ่ม ret โดย 1 และข้ามส่วนถัดไปของการทำซ้ำนี้
- ถ้า m มี x ให้เพิ่ม ret โดย (x + 1) ตั้งค่า m[x] :=0
- อย่างอื่น
- เพิ่ม m[x] ขึ้น 1
- ถ้า m[x] =x ให้ลบ x ออกจาก m
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int numRabbits(vector<int>& ans) { map <int, int> m; int n = ans.size(); int ret = 0; for(int i = 0; i < n; i++){ int x = ans[i]; if(x == 0){ ret++; continue; } if(!m.count(x)){ ret += (x + 1); m[x] = 0; }else{ m[x]++; if(m[x] == x){ m.erase(x); } } } return ret; } }; main(){ vector<int> v = {1,1,2}; Solution ob; cout << (ob.numRabbits(v)); }
อินพุต
[1,1,2]
ผลลัพธ์
5