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;
}
}