1.两数之和
https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(target - nums[i]) && map.get(target - nums[i]) != i){
return new int[]{i,map.get(target - nums[i])};
}else{
map.put(nums[i],i);
}
}
return new int[2];
}
总结:hashmap的一大优势就是存取数据时间O(1),所以使用了hashmap,使用hashmap要注意的就是key和value的选取,具体问题具体分析。这道题能一次循环就搞定的原因在于输出只要求值,不要求顺序,也就是[1,2]和[2,1]都是正确答案
46.字母异位词分组
https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
for (String str : strs) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
String s = Arrays.toString(chars);
List<String> temp_list = map.getOrDefault(s,new ArrayList<String>());
temp_list.add(str);
map.put(s,temp_list);
}
return new ArrayList<>(map.values());
}
总结:这道题的hashmap是把字符串排序后的结果当key,排序后相同的字符串的list当value,很巧妙,而且这道题中注意 map.values()方法返回的是一个Collection<里面是很多value>,这个Conllection不能直接强转为List 下面的代码是错的
ArrayList<List<String>> values = (ArrayList<List<String>>) map.values();
那么map.values就不能转为List了吗 答案藏在ArrayList的构造方法中 有一个构造方法可以直接把Collection转成ArrayList(ps: LinkedList中一样)
128.最长连续序列
https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&envId=top-100-liked
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int num : nums) {
set.add(num);
}
int len = 0;
for (Integer num : set) {
if (set.contains(num - 1)) continue;
int currentLen = 1;
while (set.contains(num + 1)){
num++;
currentLen++;
}
len = Math.max(len,currentLen);
}
return len;
}
总结:在set中添加所有的数字,本题中核心的思想在于:不需要每个数字都从自己判断到top上限,如果set中存在当前数字-1的数字,就把任务交给当前数字-1那个数字的时候再处理
标签:map,set,nums,46,LeetCodeHot100,ArrayList,int,new,两数 From: https://www.cnblogs.com/jeasonGo/p/18059288