สมมติว่าเรามีอาร์เรย์และจำนวนเต็ม k เราต้องหาจำนวนของคู่ k-diff ที่ไม่ซ้ำกันในอาร์เรย์ ในที่นี้ คู่ k-diff เป็นเหมือน (i, j) โดยที่ทั้ง i และ j มีอยู่ในอาร์เรย์ และความแตกต่างที่แน่นอนคือ k
ดังนั้น หากอินพุตเป็น [3,1,4,1,5] k =2 เอาต์พุตจะเป็น 2 เนื่องจากมี 2-diff คู่สองคู่ในอาร์เรย์เหมือน (1,3) และ ( 3,5).
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดแผนที่ที่เรียกว่าเห็นและทำแล้ว
-
กำหนดหนึ่งชุด s
-
ถ้า k <0 แล้ว −
-
คืนค่า 0
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ nums ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
(เพิ่มขึ้นเห็น[nums[i]] โดย 1)
-
ใส่ nums[i] ลงใน s
-
-
ตอบ :=0
-
สำหรับแต่ละองค์ประกอบใน s ให้ทำ -
-
ถ้า k เท่ากับ 0 แล้ว −
-
ถ้าเห็น[it]> 1 แล้ว −
-
(เพิ่มขึ้นทีละ 1)
-
-
-
มิฉะนั้น
-
เพิ่มขึ้นทำ[มัน] โดย 1
-
ถ้า (it + k) อยู่ในที่มองเห็นแต่ยังไม่เสร็จสิ้น −
-
(เพิ่มขึ้นทีละ 1)
-
-
ถ้า (มัน - k) อยู่ในที่มองเห็นแต่ไม่ทำเสร็จแล้ว −
-
(เพิ่มขึ้นทีละ 1)
-
-
-
-
กลับมาอีกครั้ง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h&g; using namespace std; class Solution { public: int findPairs(vector<int>& nums, int k) { map<int, int> seen, done; set<int> s; if (k < 0) return 0; for (int i = 0; i < nums.size(); i++) { seen[nums[i]]++; s.insert(nums[i]); } int ans = 0; for (auto it = s.begin(); it != s.end(); it++) { if (k == 0) { if (seen[*it] > 1) ans++; } else { done[*it]++; if (seen.find(*it + k) != seen.end() && done.find(*it + k) == done.end()) ans++; if (seen.find(*it - k) != seen.end() && done.find(*it - k) == done.end()) ans++; } } return ans; } }; main(){ Solution ob; vector<int> v = {3,1,4,1,5}; cout << (ob.findPairs(v, 2)); }
อินพุต
{3,1,4,1,5}, 2
ผลลัพธ์
2