1、两数之和 - 力扣(LeetCode)
思路:
- 使用哈希表,将每次x = target - nums[i],查看哈希表中是否含有这个x值
- 代码:
public int[] twoSum(int[] nums, int target) {int n = nums.length;Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < n; i++){int x = target - nums[i];if(hash.containsKey(x)){return new int[]{i, hash.get(x)};}//没有就继续添加到哈希表hash.put(nums[i],i);}//照顾编译器return new int[]{-1,-1};}
2、判定是否互为字符重排 - 力扣(LeetCode)
思路:
- 先判断两个字符串的长度,长度不相等直接返回false
- 用一个数组表示的哈希表,先添加s1的字符,再遍历s2直接减去当前字符的值,然后再判断一下,如果出现小于零的数,就说明两个字符串有不相等的字符,返回false
- 代码:
public boolean CheckPermutation(String s1, String s2) {if(s1.length() != s2.length()){return false;}int[] hash = new int[26];//将s1中的字符添加到哈希表中for(int i= 0; i < s1.length(); i++){hash[s1.charAt(i) - 'a']++;}//将s2添加到哈希表中,顺便减去相同字符的值,小于0就返回for(int i = 0; i < s2.length(); i++){hash[s2.charAt(i) - 'a']--;if(hash[s2.charAt(i) - 'a'] < 0){return false;}}return true;}
3、存在重复元素 II - 力扣(LeetCode)
思路:
- 将数据存储在哈希表中,遍历数组,遍历到一个数就在哈希表中查找是否有当前数
- 有的话就开始进行判断,没有的话就添加到哈希表
- 代码:
public boolean containsNearbyDuplicate(int[] nums, int k) {int n = nums.length;Map<Integer,Integer> hash = new HashMap<>();for(int i = 0; i < n; i++){if(hash.containsKey(nums[i])){int a = hash.get(nums[i]);if(Math.abs(a - i) <= k){return true;}}hash.put(nums[i],i);}return false;}
4、字母异位词分组 - 力扣(LeetCode)
思路:
- 首先将字符串数组里面的字符分组,然后将它们排序
- 然后遍历数组的时候判断一下key,创建一个key,这个可以都是已经排序好的了,检查哈希表中是否有这个key
- 有的话就就将原字符添加到顺序表中,没有的话就添加到哈希表中,创建顺序表
- 代码:
public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> hash = new HashMap<>();//先给字符串数组分组,然后每组字符都排序for(String s : strs){char[] tmp = s.toCharArray();//排序Arrays.sort(tmp);//创建key,这里面的字符串都是已经排序的String key = new String(tmp);//判断if(! hash.containsKey(key)){hash.put(key,new ArrayList());}//把原字符添加到数组中hash.get(key).add(s);}return new ArrayList(hash.values());}