【Leetcode_Hot100】雜湊

是你亦然發表於2024-09-01

雜湊

1. 兩數之和

49. 字母異位詞分組

128. 最長連續序列

1. 兩數之和

方法一:HashMap

在元素放入陣列之前就進行判斷,保證了不會取出同一個元素的情況,,例如[3,3],如果先將陣列中的所有元素放入hashMap,再判斷是否存在,則返回結果為[1,1],不符合題意。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];

        for(int i=0; i<nums.length; i++) {
            if(map.containsKey(target-nums[i])) {
                res[0] = i;
                res[1] = map.get(target-nums[i]);
                break;
            }
            map.put(nums[i], i);
        }

        return res;

    }
}

49. 字母異位詞分組

方法一:HashMap

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // map 記錄 <key, stringList>
        Map<String, List<String>> map = new HashMap<>();

        for(String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array);

            // key 是 任意一個字串 按字典序排列好的字串
            String key = new String(array);
            // map中如果存在list則直接獲取,否則需要新建一個list
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }

        return new ArrayList<List<String>>(map.values());

    }
}

128. 最長連續序列

方法一:HashSet

先將陣列中的元素放入Set集合中,再從nums[i]開始,依次判斷下一個元素是否在set中,如果存在則tempLength加一,最後結果resrestempLength大中取大。

class Solution {
    public int longestConsecutive(int[] nums) {
        int res = 0;

        Set<Integer> set = new HashSet<>();

        for(int i=0; i<nums.length; i++) {
            set.add(nums[i]);
        }

        for(int i=0; i<nums.length; i++) {
            int currentNum = nums[i];
            int tempLength = 1;

            while(set.contains(currentNum+1)) {
                currentNum += 1;
                tempLength++;
            }

            res = Math.max(res, tempLength);
        }

        return res;
    }
}