哈希(1、49、128)
两数之和(1)
判断target-nums[i]是否在HashMap中即可,时间复杂度O(n)
字母异位词分组(49)
利用java.util.Arrays工具类对char[]数组排序Arrays.sort(charNums);,对字母排序后转化回String,装填入HashMap中,形如HashMap<"abc": "acb","bac">,循环后取出HashMap中的所有value并返回return new ArrayList<List<String>>(groupMap.values());。学习HashMap中的getOrDefault方法,groupMap.getOrDefault("abc",new ArrayList<String>())拿到"abc"对应的value否则返回一个new ArrayList
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解释:
- 在 strs 中没有字符串可以通过重新排列来形成
"bat"。 - 字符串
"nat"和"tan"是字母异位词,因为它们可以重新排列以形成彼此。 - 字符串
"ate","eat"和"tea"是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[i]仅包含小写字母
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String,ArrayList<String>> groupMap = new HashMap<>();
for(String str:strs){
char[] charArray = str.toCharArray();
Arrays.sort(charArray);
String tmpStr = new String(charArray);
ArrayList<String> strList = groupMap.getOrDefault(tmpStr,new ArrayList<String>());
strList.add(str);
groupMap.put(tmpStr,strList);
}
return new ArrayList<List<String>>(groupMap.values());
}
}
最长连续序列(128)
哈希表(HashSet)去重;第一层循环:遍历哈希表,第二层循环:判断当前数num的前一个数num-1是否在表中,若在则该轮次必定不是最长,若不在则循环判断下一个数是否在表中并记录。
最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9示例 3:
输入:nums = [1,0,1,2]
输出:3提示:
0 <= nums.length <= 105-109 <= nums[i] <= 109
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> num_set = new HashSet<>();
for(int num:nums){
num_set.add(num);
}
int maxCount = 0;
for(int num:num_set){
if(!num_set.contains(num-1)){
int currentNum = num;
int currentCount = 1;
while(num_set.contains(currentNum+1)){
currentCount++;
currentNum++;
}
maxCount = currentCount>maxCount?currentCount:maxCount;
}
}
return maxCount;
}
}