剣はオファー03を指します。配列内の繰り返し番号(C ++)その場で置き換えます

配列内の繰り返し番号を見つけます。

長さ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;
    }
};

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114645839