448. 找到所有数组中消失的数字(简单)

这篇博客探讨了两种方法来找出整数数组中缺失的数字。第一种是利用哈希表存储每个数字出现的次数,然后找出未出现的数字。第二种是原地哈希,通过将出现的数字加n,使得最后所有出现过的数字大于n,从而找出小于等于n的未出现数字。这两种方法的时间复杂度均为O(N),但空间复杂度不同,哈希表为O(N),原地哈希为O(1)。
摘要由CSDN通过智能技术生成

思路:

利于一个哈希表,把数据都存起来

 

代码:

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
		List<Integer> res=new ArrayList<>();
		Map<Integer,Integer> map=new HashMap<>();
		
		for(int num:nums){
			map.put(num,map.getOrDefault(num,0)+1);
		}
		
		for(int i=1;i<=nums.length;i++){
			if(map.get(i)==null){
				res.add(i);
			}
		}
		return res;
		
    }
}

原地哈希

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
		List<Integer> res=new ArrayList<>();
		int n=nums.length;
		
		//原地哈希:
		//每个出现的数都+n,那么最后出现的数一定都>n
		//则<n的数就是没出现过的
		for(int num:nums){
			//计算下标
			int x=(num-1)%n;
			nums[x]+=n;
		}
		
		for(int i=0;i<n;i++){
			if(nums[i]<=n){
				//由下标变值只差1
				res.add(i+1);
			}
		}
		return res;
    }
}

 

分解:

1)哈希表

2)原地哈希:

每个出现的数都+n,那么最后出现的数一定都>n,则<=n的数就是没出现过的

 

复杂度分析:

哈希表:

时间复杂度:O(N)

空间复杂度:O(N)

 

原地哈希:

时间复杂度:O(N)

空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值