diff --git a/python/1512.py b/python/1512.py deleted file mode 100644 index b62fc68..0000000 --- a/python/1512.py +++ /dev/null @@ -1,31 +0,0 @@ -import unittest - -class Solution: - def numIdenticalPairs(self, nums: list[int]) -> int: - results = [] - result = 0 - - for i in range(len(nums)): - for j in range(i + 1, len(nums)): - if nums[i] == nums[j]: - results.append((i, j)) - - for _ in results: - result += 1 - - return result - -class TestNumIdenticalPairs(unittest.TestCase): - def setUp(self): - self.sol = Solution() - - def testNumIdenticalPairs(self): - self.assertEqual(self.sol.numIdenticalPairs([1, 2, 3, 1, 1, 3]), 4, - "Erro: esperado 4 pares bons para a lista [1, 2, 3, 1, 1, 3]") - self.assertEqual(self.sol.numIdenticalPairs([1, 1, 1, 1]), 6, - "Erro: esperado 6 pares bons para a lista [1, 1, 1, 1]") - self.assertEqual(self.sol.numIdenticalPairs([1, 2, 3]), 0, - "Erro: esperado 0 pares bons para a lista [1, 2, 3]") - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/solutions/1501-1600/1512-number-of-good-pairs/README.md b/solutions/1501-1600/1512-number-of-good-pairs/README.md new file mode 100644 index 0000000..7e2e3da --- /dev/null +++ b/solutions/1501-1600/1512-number-of-good-pairs/README.md @@ -0,0 +1,11 @@ +# 1512. Number of Good Pairs + +[LeetCode problem 1512](https://leetcode.com/problems/number-of-good-pairs/) + +- **Difficulty**: Easy +- **Tags**: array, hash-table, math, counting + +## Description + +Given an array of integers `nums`, return the number of good pairs. A pair +`(i, j)` is good if `nums[i] == nums[j]` and `i < j`. diff --git a/solutions/1501-1600/1512-number-of-good-pairs/solution.cpp b/solutions/1501-1600/1512-number-of-good-pairs/solution.cpp new file mode 100644 index 0000000..5677ee9 --- /dev/null +++ b/solutions/1501-1600/1512-number-of-good-pairs/solution.cpp @@ -0,0 +1,34 @@ +#include "solution.hpp" + +#include + +namespace leetcode::p1512 { + +int solve(const std::vector& nums) { + std::unordered_map counts; + int result = 0; + + for (int value : nums) { + auto& count = counts[value]; + result += count; + ++count; + } + + return result; +} + +int solveBruteForce(const std::vector& nums) { + int result = 0; + + for (std::size_t i = 0; i < nums.size(); ++i) { + for (std::size_t j = i + 1; j < nums.size(); ++j) { + if (nums[i] == nums[j]) { + ++result; + } + } + } + + return result; +} + +} // namespace leetcode::p1512 diff --git a/solutions/1501-1600/1512-number-of-good-pairs/solution.hpp b/solutions/1501-1600/1512-number-of-good-pairs/solution.hpp new file mode 100644 index 0000000..f1cc30f --- /dev/null +++ b/solutions/1501-1600/1512-number-of-good-pairs/solution.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace leetcode::p1512 { + +// optimized: O(n) time, O(n) space — count occurrences per value, then sum +// count * (count - 1) / 2 for each one. +int solve(const std::vector& nums); + +// brute-force: O(n^2) time, O(1) space — check every pair. +int solveBruteForce(const std::vector& nums); + +} // namespace leetcode::p1512 diff --git a/solutions/1501-1600/1512-number-of-good-pairs/test.cpp b/solutions/1501-1600/1512-number-of-good-pairs/test.cpp new file mode 100644 index 0000000..eace70b --- /dev/null +++ b/solutions/1501-1600/1512-number-of-good-pairs/test.cpp @@ -0,0 +1,15 @@ +#include + +#include "solution.hpp" + +TEST_CASE("Problem 1512 - optimized", "[p1512]") { + CHECK(leetcode::p1512::solve({1, 2, 3, 1, 1, 3}) == 4); + CHECK(leetcode::p1512::solve({1, 1, 1, 1}) == 6); + CHECK(leetcode::p1512::solve({1, 2, 3}) == 0); +} + +TEST_CASE("Problem 1512 - brute force", "[p1512]") { + CHECK(leetcode::p1512::solveBruteForce({1, 2, 3, 1, 1, 3}) == 4); + CHECK(leetcode::p1512::solveBruteForce({1, 1, 1, 1}) == 6); + CHECK(leetcode::p1512::solveBruteForce({1, 2, 3}) == 0); +}