Leetcode-217. 存在重复元素

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

解法:使用HashSet添加元素,最后判断长度即可

class Solution {
   
    public boolean containsDuplicate(int[] nums) {
   
        Set<Integer> set = new HashSet<>();
        for (int num:nums) set.add(num);
        return set.size()!=nums.length;
    }
}

Leetcode-594. 最长和谐子序列

和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。

现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。

示例 1:

输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].

说明: 输入的数组长度最大不超过20,000.

解法:使用HashMap进行计数即可

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

Leetcode-128. 最长连续序列

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

解法:每一个num作为头部的最长序列长度,等于num+1作为头部的最长序列的长度+1,使用HashMap可以将查找元素的时间复杂度降为O(N)

  • Java
class Solution {
   
    public int longestConsecutive(int[] nums) {
   
        Map<Integer, Integer> map = new HashMap<>();
        for (int num: nums) {
   
            map.put(num, 1);
        }
        for (int num: nums) {
   
            this.forward(map, num);
        }
        return this.maxCount(map);
    }
    private int forward(Map<Integer, Integer> map, int num) {
   
        if (!map.containsKey(num)) return 0;
        int count = map.get(num);
        if (count>1) return count; // 大于1说明已经计算过了,直接返回就可以了,如果不加会超出时间限制
        count = this.forward(map, num+1) + 1;
        map.put(num, count);
        return count;
    }
    private int maxCount(Map<Integer, Integer> map) {
   
        int max = 0;
        for (int key: map.keySet()) {
   
            max = Math.max(max, map.get(key));
        }
        return max;
    }
}