[剑指 offer] JT50---repeated numbers in the array (not as simple as you think)

The topic is as follows

Insert picture description here

Idea and code

Direct map query

This kind of thinking has been used many times before
... It is speechless. Obviously, the condition of 0 to n-1 is not used in this question.

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
    
    
        // write code here
        map<int,int> m;
        for(auto i:numbers){
    
    
            if(m.find(i)!=m.end()) return i;
            else m[i]=0;
        }
        return -1;
    }
};

Slightly improved, vector does not need to be queried every time like map

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
    
    
        // write code here
        const int len=numbers.size();
        vector<int> a(len);
        for(int i=0;i<len;i++){
    
    
            a[numbers[i]]++;
            if(a[numbers[i]]>1) return numbers[i];
        }
        return -1;
    }
};

Clever solution (using the range of 0 to n-1)

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
    
    
        // write code here
        int ret=-1;
        int length=numbers.size();
        for(int i=0;i<length;i++){
    
    
            while(numbers[i]!=i){
    
    
                if(numbers[i]==numbers[numbers[i]])
                    return numbers[i];
                else
                    swap(numbers[i],numbers[numbers[i]]);
            }
        }
        return ret;
    }
};

Take the example question as an example to analyze the process of ingenious solution

2 3 1 0 2 5 3
2!=0
numbers[0]=2 != numbers[2]=1
so the sequence becomes
1 3 2 0 2 5 3
1!=0
numbers[0]=1 != numbers[ 1]=3
so the sequence becomes
3 1 2 0 2 5 3
3!=0
numbers[0]=3 != numbers[3]=0
so the sequence becomes
0 1 2 3 2 5 3


i++,i=1;
numbers[1]=1;


i++,i=2;
numbers[2]=2;


i++,i=3;
numbers[3]=3;


i++,i=4;
numbers[4]=2!=4;
numbers[4]=2 == numbers[2]=2
return numbers[4]=2;

Got a duplicate number!

Guess you like

Origin blog.csdn.net/qq_42136832/article/details/115112789