leetcode哈希表1、217、594、128

哈希表1、217、594、128

leetcode1两数之和

题目:
leetcode哈希表1、217、594、128_第1张图片
代码:

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

            map.put(nums[i],i);
        }
        return new int[0];

    }
}

leetcode217 存在重复元素

leetcode哈希表1、217、594、128_第2张图片集合的大小 a.size()
复习集合(尚硅谷)
题目:
leetcode哈希表1、217、594、128_第3张图片

代码:

class Solution {
    //Set存储无序不可以重复的数值
    //不重复数组的长度等于集合的长度
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set=new HashSet<>();
        //for循环增强
        for(int i:nums){
            set.add(i);
        }
        //集合的大小set.size()
        if(set.size()==nums.length) return false;
        return true;
    }
}

leetcode594 (重点看)最长和谐子序列

题目:
leetcode哈希表1、217、594、128_第4张图片
法一

***//map中的常用方法
//(1)map.getOrDefault(key,0)的用法
//当Map集合中有这个key时,就使用这个key值;
//如果没有就使用默认值defaultValue。
//(2)map.containsKey()的用法 是否包含key值
//(3)map.get(key)获得key所获得的键值***
class Solution {
    public int findLHS(int[] nums) {
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        int ans=0;
        for(int i:nums){
            map.put(i,map.getOrDefault(i,0)+1);
        }
        for(int key:map.keySet()){
            if(map.containsKey(key+1)){
                ans=Math.max(ans,map.get(key)+map.get(key+1));
            }
        }
        return ans;
      
    }
}

此题可以参考官方题解讲解的特别清楚
法二


//哈希映射+单词扫描
class Solution {
    public int findLHS(int[] nums) {
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        int ans=0;
        for(int key:nums){
            map.put(key,map.getOrDefault(key,0)+1);
            if(map.containsKey(key+1)){
                ans=Math.max(ans,map.get(key)+map.get(key+1));
            }
            if(map.containsKey(key-1)){
                ans=Math.max(ans,map.get(key)+map.get(key-1));
            }
      
        }
        // for(int key:map.keySet()){
        //     if(map.containsKey(key+1)){
        //         ans=Math.max(ans,map.get(key)+map.get(key+1));
        //     }
        // }
        return ans;
      
    }
}
参考官方题解

leetcode128最长连续子序列

题目:
leetcode哈希表1、217、594、128_第5张图片

class Solution {
    public int longestConsecutive(int[] nums) {
        //用HashSet去重
        Set<Integer> set=new HashSet<Integer>();
        for(int num:nums){
            set.add(num);
        }
        int m=0;//用于记录最长连续序列的长度
       //存在num-1跳过,
       //不存在num-1 判断以num开头的连续序列长度
        for(int num:set){
            if(!set.contains(num-1)){
                int i=num;
                int n=1;
                while(set.contains(i+1)){
                i++;
                n++;
                }
            m=Math.max(m,n);
            }
       
        }
     return m;
    }
}

你可能感兴趣的:(java,leetcode,leetcode,数据结构,哈希表)