哈希(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 <= 104
  • 0 <= strs[i].length <= 100
  • strs[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;

    }
}