剑指offer No.3 寻找数组中重复的元素

题目:找出数组中重复的数字。

欢迎访问刘蚊子的个人博客

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

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

题解
  • 1.先将数组排序,然后扫描数组,比较数组中相邻数字是否相同。

    • 时间复杂度:O(nlongn)
    • 空间复杂度:O(1)
  • 2.使用hashmap记录数字是否出现,若出现过,则返回此数

    • 时间复杂度:O(n)
    • 空间复杂度:O(n)
  • 3.扫描数组,由于数组长度为n,并且所有数组都在0~n-1的范围内,所以当一个数组下表存储多个元素就是重复的数。

    算法详细步骤:比较数组每一个位置的下标与数组中的值(计为m),如果不相等,则将此数与数组下标为m的元素交换,如数组下标m的元素和m相等,则说明出现重复元素m,退出。若相同,则直接跳过。如果

    • 时间复杂度:O(n) 每个元素最多比较两次
    • 空间复杂度:O(1)
    class Solution {
        public int findRepeatNumber(int[] nums) {
            for(int i = 0; i < nums.length; i++){
                int now = nums[i];
                if(now==i){
                    continue;
                }
                if(nums[now]==now){
                    return now;
                }else{
                    int temp = nums[now];
                    nums[now] = now;
                    nums[i] = temp;
                    i--;
                }
            }
            return 0;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值