Leetcode 哈希表题目

Leetcode 1、Two sum
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
解析:
本题需要找到两个数相加等于目标值,所以首先想到使用Set集合,而且对于顺序并没有什么要求,因此使用哈希表来实现Set集合,即HashSet…在看发现要返回的是元素的下标,因此还要记录上每个元素的下标,因此需要用到Map集合来完成这个需求。最终本题决定采用HashMap数据结构来完成。

class Solution{
	public int twoSum(int[] nums, int target){
		HashMap<Integer, Integer> hashMap = new HashMap<>();
		for(int i = 0; i < nums.length; i++){
			if(hashMap.containsKey(target - nums[i])){
				return new int[][]{i, hashMap.get(target - nums[i])}
			}else{
				hashMap.put(nums[i], i)
			}
		}
		return null;	
	}
}

Leetcode 217、存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
解析:
对于重复性问题第一时间想到集合,因为集合是不包含重复性元素的。对于本体题说,数组中可以包含重复元素的,但是集合却不可以,因此遍历数组将其存放于集合中,最后来比较数组的长度和集合的长度,如果相同则表示没有重复的元素,如果集合的长度小于数组的长度则表示有重复的元素。

class Solution{
	public  boolean containsDuplicate(int[] nums){
			HashSet<Integer> set = new HashSet<>();
			for(int i = 0; i < nums.length; i++){
					set.add(nums[i]);
			}
			return set.size() < nums.length;
	}
}

Leetcode 594、最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
解析:
本体中是要找到数组中相差为一的数一共有多少个,因此需要统计每个数的个数,再找到相差为一的两个数,计算出两个数的数量之和就可以计算出。因此要选用map集合来完成本题。键为数组的元素,值为这个元素的个数。


```java
class Solution{
	public int findLHS(int[] nums){
		int longest = 0;
		HashMap<Integer, Integer> map = new HashMap<>();
		for(int num : nums){
			map.put(num, map.getOrDefalut(num, 0) + 1);
		}
		for(Integer key : map.keySet()){
			if(map.containsKey(key + 1)){
				longest = Math.max(longest, map.get(num) + map.get(num + 1));
			}
		}
		return longest;
	}
}

Leetcode 128、最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
解析:
本题可以采用集合的方法来完成。先将数组放入到集合中,因为是寻找最长的连续序列的长度,因此重复的数据没有作用,放入到set中不会有影响。然后在遍历集合,这里遍历有些技巧,不是每个都要遍历,而是遍历那些没有相邻前一个数的元素,以保证得到的长度一定是连续数列中最大的。

class Solution{
	public int longestConsecutive(int[] nums){
		HashSet<Integer> set = new HashSet<>();
		int longest = 0;
		for(int num : nums){
			set.add(num);
		}
		for(int i : set){
			if(!set.contains(i - 1)){
				int cur = i;
				int cur_long = 1;
				while(set.contains(cur + 1)){
					cur += 1;
					cur_long += 1;
				}
				longest = Math.max(longest, cur_long);
			}
		}
		return longest;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值