From f61727af1e0ee0e3f42fb10213edd11083bba658 Mon Sep 17 00:00:00 2001 From: eat-swap Date: Mon, 25 Apr 2022 23:37:53 +0800 Subject: [PATCH] add: 220425-CN [cpp] --- cpp/2204/220425-CN.cpp | 31 +++++++++++++++++++++++++++++++ cpp/2204/CMakeLists.txt | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 cpp/2204/220425-CN.cpp diff --git a/cpp/2204/220425-CN.cpp b/cpp/2204/220425-CN.cpp new file mode 100644 index 0000000..c79245d --- /dev/null +++ b/cpp/2204/220425-CN.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +/** + * 398. Random Pick Index + * Given an integer array nums with possible duplicates, randomly output the index of a given target number. You can assume that the given target number must exist in the array. + * Implement the Solution class: + * Solution(int[] nums) Initializes the object with the array nums. + * int pick(int target) Picks a random index i from nums where nums[i] == target. If there are multiple valid i's, then each index should have an equal probability of returning. + */ + +class Solution { +private: + std::unordered_map> m; + + std::mt19937 r; + +public: + explicit Solution(const std::vector& nums) : r(std::time(nullptr)) { + auto x = nums.size(); + while (x--) { + m[nums[x]].push_back(x); + } + } + + int pick(int target) { + return m[target][r() % m[target].size()]; + } +}; diff --git a/cpp/2204/CMakeLists.txt b/cpp/2204/CMakeLists.txt index baa8a41..813ae3c 100644 --- a/cpp/2204/CMakeLists.txt +++ b/cpp/2204/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2204) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2204 220425.cpp) +ADD_EXECUTABLE(2204 220425-CN.cpp)