1. 两数之和
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>(); //map是numToIndex,反着存的int len = nums.length;for(int i=0; i<len; i++){//在哈希表中找,是否含有另一个数字if(!map.containsKey(target - nums[i])){//没有,就把现在这个存上map.put(nums[i], i);}else{//有,就获取另一个数字的下标int j = map.get(target - nums[i]);return new int[]{i, j};}}//走到这里说明没有return null;}
}
217. 存在重复元素
class Solution {public boolean containsDuplicate(int[] nums) {Map<Integer, Integer> numToIndex = new HashMap<>();int len = nums.length;for(int i=0; i<len; i++){if(!numToIndex.containsKey(nums[i])){numToIndex.put(nums[i], i);}else{return true;}}return false;}
}
class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set = new HashSet<>();int len = nums.length;for(int i=0; i<len; i++){set.add(nums[i]);}return (set.size()<len)?true:false;}
}
49. 字母异位词分组(api)
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> ans = new HashMap<>();int len = strs.length;for(int i=0; i<len; i++){//String转为char[]:toCharArray()方法char[] arr = strs[i].toCharArray();//对char[]排序:Arrays.sort(arr)Arrays.sort(arr);//char[]转为String:new String(arr)方法String key = new String(arr);//map里面是put、get方法//list里面是add、get方法if(!ans.containsKey(key)){ans.put(key, new ArrayList<String>());}ans.get(key).add(strs[i]); }return new ArrayList<>(ans.values());}
}
128. 最长连续序列(Set的api)
class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<Integer>();//把所有的数放进set中int len = nums.length;for (int i = 0; i < len; i++) {set.add(nums[i]);}int max = 0;int tempMax = 0;for (int i = 0; i < len; i++) {//如果当前的数是一个连续序列的起点if (!set.contains(nums[i] - 1)) {tempMax = 1;//就统计这个连续序列的长度int x = nums[i];while (set.contains(x + 1)) {tempMax++;x++;}}max = (tempMax > max) ? tempMax : max;}return max;}
}
594. 最长和谐子序列
(1)Map做法,需熟悉Map的API
map.getOrDefault(num, 0)+1,存在返回num的value并加一,不存在返回0再加一
map.keySet(),返回map的key的集合,并且排好序了
class Solution {public int findLHS(int[] nums) {Map<Integer, Integer> map = new HashMap<>();for(int num : nums){map.put(num, map.getOrDefault(num, 0)+1);}int max=0;int tempMax=0;//map.keySet()返回set的key的集合for(int num : map.keySet()){//map.keySet()已经排好序了//计算num的个数 加 num+1的个数if(map.containsKey(num+1)){tempMax = map.get(num)+map.get(num+1);}max = (tempMax>max)?tempMax:max;}return max;}
}
(2)常规做法,滑动窗口/双指针
class Solution {public int findLHS(int[] nums) {Arrays.sort(nums);int max = 0;int start=0, end=0;while(end<nums.length){//相邻的值大于1,头指针后移if(nums[end]-nums[start]>1) start++;//相邻的值正好差1,用头尾指针的坐标去更新maxif(nums[end]-nums[start]==1){max=Math.max(max, end-start+1);}//每次都要后移endend++;}return max;}
}