diff --git a/CMakeLists.txt b/CMakeLists.txt index dd31113..3ef539a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,3 +43,4 @@ add_subdirectory( top-k-frequent-elements ) add_subdirectory( two-sum ) add_subdirectory( valid-parentheses ) add_subdirectory( convert-1d-array-into-2d-array ) +add_subdirectory( kth-largest-element-in-a-stream ) diff --git a/kth-largest-element-in-a-stream/CMakeLists.txt b/kth-largest-element-in-a-stream/CMakeLists.txt new file mode 100644 index 0000000..959b922 --- /dev/null +++ b/kth-largest-element-in-a-stream/CMakeLists.txt @@ -0,0 +1,23 @@ +project(kth_largest_element_in_a_stream) + +add_executable( + kth_largest_element_in_a_stream_tests + tests.cpp +) + +add_executable( + kth_largest_element_in_a_stream_runner + runner.cpp +) + +target_link_libraries( + kth_largest_element_in_a_stream_tests + GTest::gtest_main +) + +target_link_libraries( + kth_largest_element_in_a_stream_runner + utils +) + +gtest_discover_tests(kth_largest_element_in_a_stream_tests) diff --git a/kth-largest-element-in-a-stream/README.md b/kth-largest-element-in-a-stream/README.md new file mode 100644 index 0000000..086abd9 --- /dev/null +++ b/kth-largest-element-in-a-stream/README.md @@ -0,0 +1,3 @@ +# 2022. Convert 1D Array Into 2D Array + +[LeetCode link](https://leetcode.com/problems/convert-1d-array-into-2d-array/) diff --git a/kth-largest-element-in-a-stream/runner.cpp b/kth-largest-element-in-a-stream/runner.cpp new file mode 100644 index 0000000..0464622 --- /dev/null +++ b/kth-largest-element-in-a-stream/runner.cpp @@ -0,0 +1,13 @@ +#include +#include + +#include "print_vector.hpp" + +#include "solution.hpp" + +int main() +{ + KthLargest s(3, { 1,2,3 }); + std::cout << s.add(4); + return 0; +} \ No newline at end of file diff --git a/kth-largest-element-in-a-stream/solution.hpp b/kth-largest-element-in-a-stream/solution.hpp new file mode 100644 index 0000000..f5e69aa --- /dev/null +++ b/kth-largest-element-in-a-stream/solution.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include +#include +#include + +class KthLargest { + std::multiset> scores; + const int k; +public: + KthLargest(int k, const std::vector& nums) : k(k) { + assert(k > 0); + for (auto score : nums) { + add(score); + } + } + + int add(int val) { + if (scores.size() < static_cast(k)) { + scores.insert(val); + } + else { + auto it = scores.lower_bound(val); + if (it != scores.end()) { + scores.insert(val); + scores.erase(std::prev(scores.end())); + } + } + return *(scores.rbegin()); + } +}; \ No newline at end of file diff --git a/kth-largest-element-in-a-stream/tests.cpp b/kth-largest-element-in-a-stream/tests.cpp new file mode 100644 index 0000000..dbf7fd8 --- /dev/null +++ b/kth-largest-element-in-a-stream/tests.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include + +#include "solution.hpp" + +typedef std::vector ll; +typedef ll::size_type ll_size_type; + +class KthLargestTest :public ::testing::TestWithParam> { +}; + +TEST_P(KthLargestTest, CheckSolution) { + auto param = GetParam(); + int k = std::get<0>(param); + const ll initial = std::get<1>(param); + const ll additional = std::get<2>(param); + const ll expected = std::get<3>(param); + + KthLargest solution(k, initial); + + int result = 0; + EXPECT_EQ(additional.size(), expected.size()); + + for (ll_size_type i = 0; i < additional.size(); ++i) { + EXPECT_EQ(expected[i], solution.add(additional[i])); + } +} + +INSTANTIATE_TEST_SUITE_P( + KthLargestTests, + KthLargestTest, + ::testing::Values( + std::tuple(1, { 1, 2, 3 }, { 1, 2, 3 }, { 3, 3, 3 }), + std::tuple(1, { 2 }, { 3, 1 }, { 3, 3 }), + std::tuple(2, { 2, 2, 2, 2 }, { 2, 3, 2 }, { 2, 2 , 2 }), + std::tuple(3, { 4, 5, 8, 2 }, { 3, 5, 10, 9, 4 }, { 4, 5, 5, 8, 8 }) + ) + ); \ No newline at end of file