配列内の繰り返し番号を見つけます。
長さnの配列nums内のすべての数値は、0〜n-1の範囲です。配列内のいくつかの数字が繰り返されていますが、何回繰り返されているのか、また各数字が何回繰り返されているのかわかりません。配列内で重複する番号を見つけてください。
例1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
制限:
2 <= n <= 100000
アイデア:
繰り返される数字がない場合、通常の並べ替えの後、数字iは添え字iの位置にあるはずなので、配列を再度スキャンし、添え字iのある数字がiでない場合は、(がm)の場合、添え字mを使用して数値交換を行います。交換の過程で、繰り返し番号がある場合は、終了して返品してください
著者:derrick_sun
リンク:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/yuan-di-zhi-huan-shi-jian-kong -jian-100-by-derrick /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int temp;
for(int i=0;i<nums.size();i++){
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
//交换nums[i]和nums[temp];目的是使得nums[temp]==temp
//nums[i]==3,temp=3,nums[temp]==nums[3]
//nums[i]等于交换前的nums[3],nums[temp]==temp,nums[3]==3,
//如下代码相当于给数字放在其索引的位置
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
};