classSolution { public: intcel_div(int a, int b) { return (a + b - 1) / b; } intfindSmallestInteger(vector<int> &nums, int value) { // 先将所有负数变为正数 // 再将所有数变为除以value的余数
int i; int n = nums.size(); int top_value; int last_value; int count = 0; priority_queue<int, vector<int>, std::greater<int> > min_heap;
for (i = 0; i < n; i++) { if (nums[i] < 0) { nums[i] += cel_div(-nums[i], value) * value; } nums[i] = nums[i] % value; min_heap.push(nums[i]); }
value的余数的所有可能取值为一组,假设有group组value的余数的所有可能取值,那么最终数组最大至少取到$value \times group -1$,从nums中去掉这些组的值,剩下的里面,必定缺少value余数的所有可能取值中的一个,我们找缺少的最小值加上$value \times group -1$即可。编程来看就是统计各个余数的个数,找个数中最小的那个为group,最小的当然不能为0,
classSolution { public: intcel_div(int a, int b) { return (a + b - 1) / b; } intfindSmallestInteger(vector<int> &nums, int value) { // 先将所有负数变为正数 // 再将所有数变为除以value的余数
int i; int n = nums.size(); int group = INT_MAX;
int res;
unordered_map<int, int> umap;
if (value == 1) { return n - 1; }
for (i = 0; i < n; i++) { if (nums[i] < 0) { nums[i] += cel_div(-nums[i], value) * value; } nums[i] = nums[i] % value; umap[nums[i]]++; }
for (i = 0; i < value; i++) { if (umap.count(i) == 0) { return i; } }
for (auto &[num, count] : umap) { if (count < group) { group = count; res = num; } elseif (count == group) { res = std::min(res, num); } }