剑指offer_查找数组中的任一重复元素

Posted chenxionghfut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer_查找数组中的任一重复元素相关的知识,希望对你有一定的参考价值。

题目要求:

题目一: 
1.有一个长度为n+1的整型数组中有所有数字都在1~n范围内的数组
2.找出数组中任意一个重复的数字
3.不允许修改原始数组

思路1:浪费时间的算法 时间复杂度为O(logn) 空间复杂度为O(1)
1.题目说明数组中肯定存在重复的数字
B.采用二分查找法,将总范围划分为左右两个范围,遍历整个数组,统计数组元素数值处于左范围内的个数,
如果数组元素在左边范围内的个数大于这个范围的长度,说明左范围内肯定存在重复元素,
到左范围内找,否则到右范围内找,直到下线等于上限,注意这里输出的是上限或者下限的值,这个算法的核心依据元素值的大小去找它所对应的归宿。

代码:

public static int getDupliCationCostTime(int[] arrays){
    int low=1;
//因为数组元素的数值范围是1-n
int high=arrays.length-1;
int mid;
while (low<high){
int count=0;
mid=(low+high)/2;
for (int i=0;i< arrays.length;i++){
if (low<=arrays[i]&&arrays[i]<=mid){
count++;
}
}
//如果在范围内的元素个数大于左范围的长度,则到左范围中去找
if (count>(mid-low+1)){
high=mid;
}else {
low=mid+1;
}
}
return high;
}

思路二:浪费空间的算法:
开辟一个辅助数组,长度为要查找数组长度加一;遍历原数组,将原数组中值为m的元素copy到辅助数组下标为m的位置
每copy一次都要比较辅助数组下标为m位置的元素是否等于要插入的元素,如果等,说明已经copy此元素,很明显,这个元素就是我们要找的重复元素
代码
public static int getDupliCationCostSpace(int[] arrays){
   int[] assistArrays=new int[arrays.length+1];
int k=0;
for (int i=0;i<arrays.length;i++){
if (arrays[i]!=assistArrays[arrays[i]]){
assistArrays[arrays[i]]=arrays[i];
}else {
k=arrays[i];
break;
}
}
return k;
}


题目二:
要求:1.允许修改原始数组
2.找出数组中任意一个重复的数字
3.
有一个长度为n的整型数组中有所有数字都在0~n-1范围内的数组
思路:遍历这个数组,遍历到下标为i位置时,假设这是的元素值是m,判断m与下标是否相等,如果相等,说明这个元素m正在处于属于自己的位置,
否则将m于下标为m的数组元素进行比较,如果不等,将二者进行交换,若相等,则说明这个人元素m是重复的元素,输出m。

代码:
public static int getDuplication(int[] arrays) {
int k=0;
int help;
for (int i = 0; i < arrays.length; i++) {
//当前元素与下标不对应时
while (arrays[i] != i) {
if (arrays[arrays[i]] == arrays[i]) {
k=arrays[i];
//说明找到了重复元素
i=arrays.length-1;
break;
} else {
help=arrays[i];
arrays[i]=arrays[arrays[i]];
arrays[help]=help;
}
}
}
return k;
}




























以上是关于剑指offer_查找数组中的任一重复元素的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 11. 旋转数组的最小数字

《剑指Offer》二维数组中的查找

Notes4剑指offer_03-20题

剑指Offer_4_二维数组中的查找

二维数组中的查找(剑指offer_4)

剑指 Offer 11. 旋转数组的最小数字-二分查找