2021-03-04

Leetcode offer系刷题 || 查找数组中重复的数字☆

题目:返回数组中任意一个重复数字。2 <= n <= 100000

1.方法一:空间换时间

用另一个数组记录原数组元素出现的次数,将原数组的数据当另一个数组的下标。
class Solution {
    public int findRepeatNumber(int[] nums) {
        int len=nums.length;
        int[] sums=new int[len];
        for(int i=0;i<nums.length;i++)
        {
            System.out.println(sums[i]);
            if( sums[nums[i]] !=0 )
            {
                return nums[i];
            }
            sums[nums[i]]+=1;
        }
        return -1;
    }
}

2.借助 集合 结构

将一个元素放入集合中,然后判断是否已经在集合中。

耗时耗空间。

Set<Integer> set = new HashSet<Interger>();
//注意这里和开数组的区别,这里后面用的是括号()
set.add(num);//这个函数返回布尔型,true/false
//其他集合和哈希表的用法补充在另外一个基础知识篇中。

3.原地置换!

和第一个想法一样,不过是在原数组地方做置换

将元素为i的元素和下标为i的位置做转换

class Solution {
    public int findRepeatNumber(int[] nums) {
        int tmp;
        for(int i=0;i<nums.length;i++)
        {
            if(nums[i] == i)
            continue;
            //注意在这里判断一下,本来在本位置上的跳过
            tmp = nums[nums[i]];
            if(nums[nums[i]] == nums[i])
            {
                return nums[i];
            }
            else
            {
            nums[nums[i]] = nums[i];
            nums[i] = tmp;
            }   
        }
        return -1;
    }
}

4.哈希表

几个方法中最耗时耗空间的!因为又要查找key,又要存储

class Solution {
    public int findRepeatNumber(int[] nums) {
        Map<Integer, Integer> hashmap = new HashMap<>();
        for(int num : nums){
            if(hashmap.containsKey(num)){
                return num;
            }
            hashmap.put(num, 0);
        }
        return -1;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值