[剑指offer]JT50---数组中重复的数字(没你想得那么简单)

题目如下

在这里插入图片描述

思路与代码

直接map查询

这种思路在前面已经用过很多次了
…都无语了,这题显然没有用到0到n-1这个条件

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

稍微提升一点,vector不用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;
    }
};

巧解(用到了0到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;
    }
};

以例题为例,分析巧解过程

2 3 1 0 2 5 3
2!=0
numbers[0]=2 != numbers[2]=1
所以序列变为
1 3 2 0 2 5 3
1!=0
numbers[0]=1 != numbers[1]=3
所以序列变为
3 1 2 0 2 5 3
3!=0
numbers[0]=3 != numbers[3]=0
所以序列变为
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;

得到了重复的数字!

猜你喜欢

转载自blog.csdn.net/qq_42136832/article/details/115112789