Leedcode算法专题训练(哈希表)

Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。

Java 中的 HashMap 主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。在对一个内容进行压缩或者其它转换时,利用 HashMap 可以把原始内容和转换后的内容联系起来。

1. 数组中两个数的和为给定值

1. Two Sum (Easy)

Leetcode / 力扣

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

    }
}

2. 判断数组是否含有重复元素

217. Contains Duplicate (Easy)

Leetcode / 力扣

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashSet<Integer> set=new HashSet<>();
        for(int num:nums){
            if(set.contains(num))return true;
            else set.add(num);
        }
        return false;
    }
}

3. 最长和谐序列

594. Longest Harmonious Subsequence (Easy)

Leetcode / 力扣

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

4. 最长连续序列

128. Longest Consecutive Sequence (Hard)

Leetcode / 力扣

class Solution {
    public int longestConsecutive(int[] nums) {
        HashSet<Integer>set=new HashSet<>();
        for(int num:nums){
            set.add(num);
        }
        int result=0;
        for(int i=0;i<nums.length;i++){
            if(!set.contains(nums[i]-1)){
                int length=1;
                int num=nums[i];
                while(set.contains(num+1)){
                    length+=1;
                    num+=1;
                }
                result=Math.max(length,result);
            }
        }
        return result;

    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值