数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
 
不改变数组结构的解法:
public static int findDup(int[] numbers) {
int length = numbers.length;
for (int i = 0 ; i < length; i++) {
int index = numbers[i];
if (index >= length) {
index -= length;
}
if (numbers[index] >= length) {
return index;
}
numbers[index] = numbers[index] + length;
}
return - 1 ;
}
 
改变数组结构的解法:时间复杂度O(n)

可以将值为 i 的元素放到第 i 个位置上.

从头到尾依次扫描这个数字中的每个数字,当扫描到下标为i的数字,首先比较这个数字(用m表示)是不是等于i,如果是,则继续扫描下一个,如果不是,就就拿它和第m个数字比较,如果它和第m个数字相等,就找到了一个重复的数字;如果不相等,就把第i个数字与第m个数字交换,把m放到属于它的位置,接下来再重复这个比较,交换的过程,直到我们发现一个重复的数字

position-0 : (2,3,1,0,2,5) // 2 <-> 1
      (1,3,2,0,2,5) // 1 <-> 3
      (3,1,2,0,2,5) // 3 <-> 0
      (0,1,2,3,2,5) // already in position
position-1 :  (0,1,2,3,2,5) // already in position
position-2 :  (0,1,2,3,2,5) // already in position
position-3 :  (0,1,2,3,2,5) // already in position
position-4 :  (0,1,2,3,2,5) // nums[i] == nums[nums[i]], exit

 

public static int findRepeatNumber(int[] nums){
if(nums.length==0){
return -1;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i]<0 || nums[i]>nums.length-1) {
return -1;
}
}
for (int i = 0; i < nums.length; i++) {
while(nums[i]!=i){ //
if(nums[i]==nums[nums[i]]){
return nums[i];
}
int tmp = nums[i];
nums[i]=nums[tmp];
nums[tmp]=tmp;
}
}
return -1;
}



int find_dup( int numbers[], int length) {

    for ( int i= 0 ; i<length; i++) {

        int index = numbers[i];

        if (index >= length) {

            index -= length;

        }   

        if (numbers[index] >= length) {

            return index;

        }   

        numbers[index] = numbers[index] + length;

    }   

    return - 1 ; 

}

posted @   MarkLeeBYR  阅读(91)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示