梳理 “剑指offer+LeetCode” 算法思路之找出数组里重复的数字

剑指offer之找出数组里重复的数字

题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

情景比喻
这就好像乱序坐的学生根据座位号找自己的座位。只要学生不是该位置,就不停的换学生过来,直到该位置坐对了人就继续检查下一个座位的同学。在换学生这个过程中,如果要被换过去的学生座位上有人,就找到了重复的座位号。

搞清楚题目

首先要 搞清楚 题目的含义!!!(敲黑板)

有以下这 3 个点:

1 人家给你的数组里面的数值是有范围的(0到n-1)。
2 数组长度n
3 只要找到 一个 重复的数字,就可以返回了。

所以思路来了:

把不在 i 位置上的 m 送到它该在的 m 位置上 的过程中,只要发现 m 位置上已经有了 m 就找到了重复数字 m

用到的工具:(for循环+while循环+if语句)

for 循环满足:i 就在 i 位置上才进入循环。
while循环满足: i 位置上不是 i ,是m。
while循环里面做的事:做if判断,找出重复数字。
if 条件句里面做的事:判断 i 位置的数字m在不在它该在的m位置上。不在 就交换i和m,继续while循环。在 就找到了重复数字。

下面展示 核心代码。

// 遍历数组,找出重复数字。
for( int i=0;i<length;i++{
while( nums[i] != i){
   int m=nums[i];//获取第i个位置里的值,放到m变量里面
   if( nums[m] == m ){
    return i;
   }
   //把m送到第m个位置上,以便更新第i个位置上的值,准备进行下一次while循环
   int n = nums[m];//获取第m个位置里的值,放到n变量里面
   nums[i]=n;
   nums[m]=m;
}
}

总结
1“只要学生不是该位置,就不停的换学生过来” 对应的就是while循环。
2“检查下一个学生” 走的是for循环。

个人想法:
以上是我在做代码实现的时候,把我认为难以理解的地方(我认为难点就在怎样使用循环)做了思路梳理,每个人的思维方式不同,所以每个人在写完整代码的过程中会遇到不同的难题,只要把每个难点放大,拿出来梳理,便可以解决所有的难点。欢迎大家在评论区做写出做算法题时自己遇到的难题,拿出来一起探讨,希望能用最短的时间成本帮您解决问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章