哈希表1、217、594、128
leetcode1两数之和
题目:
代码:
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 存在重复元素
集合的大小 a.size()
复习集合(尚硅谷)
题目:
代码:
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 (重点看)最长和谐子序列
题目:
法一
***//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最长连续子序列
题目:
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;
}
}