剑指offer第1题:找出数组中重复的数字

1、数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

限制:

2 <= n <= 100000

来源:力扣(LeetCode)
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/


思路
从前往后遍历,每个数都会有自己对应的坑位(==元素对应数组的下标)如果发现当前的坑位的数与对应的坑位上的数是不一样的,那么它就应该回去自己的坑位上, 并且继续判断。 如果发现对应坑位已经是该有的数了,那么就可以判断一下它两是不是重复了。

字有点丑。。。将就一下
剑指offer第1题:找出数组中重复的数字_第1张图片




代码实现:

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        for(int i = 0; i < nums.size(); i ++ ) {
            while(i != nums[i] && nums[nums[i]] != nums[i]) swap(nums[i], nums[nums[i]]);   //不断的回去自己的坑位
            if(i != nums[i] && nums[i] == nums[nums[i]]) return nums[i];
        }
        return -1;      //我没有用处,特殊出口
    }
};

其实为什么要全部遍历完呢,因为一开始本身那个数是有可能是对的,所以要从前往后遍历完为止。
这种情况要自己推一遍案例哈。

你可能感兴趣的:(剑指offer全刷,算法,leetcode,algorithm)