剑指 Offer 03. 数组中重复的数字

文章提供了三种不同的Java方法来找出整数数组中的重复数字。第一种是双层循环检测法,第二种和第三种利用元素下标与值的关系进行交换,通过while循环确保数组元素在其正确位置,当找到重复数字时立即返回。若无重复数字,则返回-1。
摘要由CSDN通过智能技术生成
/**
 * 定义一个函数,输入为整数数组,输出为重复数字
 */
public int findRepeatNumber(int[] nums) {
    int arr = 0; // 定义一个变量用来存储重复数字
    for(int i = 0; i < nums.length - 1; i++) { // 第一层循环,遍历整个数组
        for (int j = i + 1; j < nums.length; j++) { // 第二层循环,从当前位置的下一位开始遍历数组
            if (nums[i] == nums[j]) { // 如果发现重复数字
                arr = nums[i]; // 将重复数字存储到变量中
                break; // 跳出循环
            }
        }
        if (arr != 0) break; // 如果已经找到重复数字,跳出循环
    }
    return arr; // 返回重复数字
}
/**
 * 遍历数组,如果当前元素不等于它所在的下标,交换 nums[i] 和 nums[nums[i]] 位置上的元素,
 * 使得 nums[i] 处的元素等于它所在的下标,直到找到重复数字。
 */
public int findRepeatNumber(int[] nums) {
    for (int i = 0; i < nums.length; i++) { // 遍历数组
        while (nums[i] != i) { // 如果当前元素不等于它所在的下标
            if (nums[i] == nums[nums[i]]) { // 如果当前元素所在的位置已经有相同的元素了,说明找到了重复数字
                return nums[i]; // 直接返回该重复数字
            }
            int temp = nums[i]; // 交换 nums[i] 和 nums[nums[i]] 位置上的元素,使得 nums[i] 处的元素等于它所在的下标
            nums[i] = nums[temp];
            nums[temp] = temp;
        }
    }
    return -1; // 如果数组中没有重复数字,则返回 -1
}
/**
 * 利用限制条件,将空间复杂度降到 O(1)。由于数组中的元素值都在 [0, n-1] 的范围内,
 * 因此可以利用这个限制条件,将数组看成一个哈希表,在遍历数组时,将每个元素放到它所对应的位置上,
 * 如果发现该位置上已经有相同的元素了,说明找到了重复数字。
 */
public int findRepeatNumber(int[] nums) {
    for (int i = 0; i < nums.length; i++) { // 遍历数组
        while (nums[i] != i) { // 如果当前元素不等于它所在的下标
            if (nums[i] == nums[nums[i]]) { // 如果当前元素所在的位置已经有相同的元素了,说明找到了重复数字
                return nums[i]; // 直接返回该重复数字
            }
            int temp = nums[i]; // 交换 nums[i] 和 nums[nums[i]] 位置上的元素
            nums[i] = nums[temp];
            nums[temp] = temp;
        }
    }
    return -1; // 如果数组中没有重复数字,则返回 -1
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值