leetcode 2598 执行操作后的最大MEX
一、问题描述
二、解题思路
具体思路
可以借助同余的性质来解决这个问题。如果a%value==b%value,则a在经过一定次数的变换后一定可以变成b;
整体思路
(1)首先,遍历nums数字,统计余数的频次,r[i]表示余数为i的数的个数。
注意:(x%value+value)%value是对负数求余进行了修正,否则结果是不对的。
(2)然后,从0开始加一枚举,如果r[i%value]!=0,表示存在一个数字可以经过变换成为i,然后执行r[i%value]--,表示这个数字已经用过了。如果r[i%value]==0,表示没有数字可以变换成为i,直接返回这时的i即可,这时的i即为所求。
(3)如果没有找到,直接返回-1;
三、代码实现
class Solution {
public:int findSmallestInteger(vector<int>& nums, int value) {//统计余数频次vector<int>r(value,0);for(auto x:nums){int tmp=(x%value+value)%value;r[tmp]++;}//寻找缺失的最小整数for(int i=0;;i++){int tmp=i%value;if(r[tmp]==0) return i;else{r[tmp]--;}}return -1;}
};