1. 哈希
1.1 兩數之和
題目描述:
-
給定一個整數數組
nums
和一個整數目標值target
,請你在該數組中找出 和為目標值target
的那 兩個 整數,并返回它們的數組下標。 -
你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。
-
你可以按任意順序返回答案。
力扣鏈接:
https://leetcode.cn/problems/two-sum/description/【簡單】
解題思路:
-
實例化一個
HashMap
來保存<值, 索引>
-
遍歷HashMap,找到就返回索引下標,找不到就添加元素
核心代碼:
class Solution {public int[] twoSum(int[] nums, int target) {// map保存<值,索引>Map<Integer,Integer> map = new HashMap<>();for(int 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); // 返回[索引1,索引2]}return new int[0]; // 返回[]}
}
1.2 字母異位詞分組
題目描述:
-
給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。
-
字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。
力扣鏈接:
https://leetcode.cn/problems/group-anagrams/description【中等】
解題思路:
- Map保存
<排序后的字符串, List<String>>
- 遍歷strs, 依次添加到Map
核心代碼:
class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 1. Map保存<排序后的str, List<String>>Map<String, List<String>> map = new HashMap<>();// 2. 遍歷strs, 依次添加到Mapfor (String str : strs){char[] charStr = str.toCharArray();Arrays.sort(charStr);String orderStr = new String(charStr);if (map.containsKey(orderStr)){map.get(orderStr).add(str);}else{List<String> temp = new ArrayList<>();temp.add(str);map.put(orderStr,temp);}}return new ArrayList<List<String>>(map.values());}
}
1.3 最長連續序列
題目描述:
-
給定一個未排序的整數數組
nums
,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。 -
請你設計并實現時間復雜度為
O(n)
的算法解決此問題。
力扣鏈接:
https://leetcode.cn/problems/longest-consecutive-sequence/description【中等】
解決思路:
- 將nums數組的所有元素放入HashSet,去除重復元素
- 從序列的最小值開始找,更新最大值
核心代碼:
class Solution {public int longestConsecutive(int[] nums) {// 1. 將nums數組的所有元素放入HashSet, 去除重復元素HashSet<Integer> hs = new HashSet<>();for (int i : nums){hs.add(i);}int ans = 0;for (int i : hs){// 2. 只從序列的最小值開始找if (!hs.contains(i - 1)){int curAns = 1;while(hs.contains(i+1)){i++;curAns++;}ans = Math.max(ans,curAns);}}return ans; }
}