剑指offer——数组中重复的数字

数组中重复的数字

https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&&tqId=11203&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

![图片说明](https://uploadfiles.nowcoder.com/images/20200603/230393819_1591186735157_79C2F10421058BC21DE3C5524B46B4BA "图片标题")
我的代码都是参考了牛客网的题解的,可能有些没有改过,但是是我自己看懂了再打上来的,由于是新手,请大家多多包涵
解题思路:
方法1
in-place 方法
由题目可得,长度为n的的数组的所有数字都在0~n-1范围,总结,如果数组中没有重复的数字的话,那会有:值=下标索引,但是在数组中其值可能不等于下标索引,这个时候我们需要做的就是:(1)第一次遇到,将值与其对应的下标索引的值交换(2)第二次,如果再有交换操作那就说明找到重复数字
代码:
过程:
1.for循环:根据数组长度构建循环次数,i = 0,由数组索引作为循环因子
2.while循环:判断数组值是否和索引相等,如果不相等则进入循环,相等则开始比较下一个数字
3.if-else循环:判断的是当前数组值是否和数组的数组值相等,比如n[1]的值是是否和n[n[1]]相等,如果不相等,那就交换它们的位置,如果相等则找到了重复的数字。

class Solution {
public:
    bool duplicate(int numbers[], int length, int* duplication) {
         //构建一个序列,开始进行换位判断
        for(int i=0;i<length;i++)
        {
            while(numbers[i]!=i)
            {
                if(numbers[i]!=numbers[numbers[i]])
                swap(numbers[i],numbers[numbers[i]]);
                else
                {
                    *duplication = numbers[i];
                    return true;
                }
            }
        }
       return false;
    }
};

方法2:
哈希+遍历
1.建立一个哈希表,全部置为false,将第一次遇到的值置为true,如果再遇到true说明就找到了重复的值

class Solution {
public:
    bool duplicate(int numbers[], int length, int* duplication) {
    //新建哈希表
        vector<bool> f(length, false);
    //遍历
        for (int i=0; i<length; ++i) {
            if (!f[numbers[i]]) {
                f[numbers[i]] = true; 
            }
    //找到结果
            else {
                *duplication = numbers[i];
                return true;
            }
        }
        return false;
    }
};
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务