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); } }