leetcode 100hot
哈希
1.两数之和
哈希表的使用
通过但是时间复杂度O(N^2).
import java.util.HashMap;
class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> arr = new HashMap<Integer, Integer>();int[] two = new int[2];for(int i = 0; i < nums.length; i++){arr.put(i, nums[i]);}for (Integer i : arr.keySet()) {for (Integer j : arr.keySet()) {if(i !=j && arr.get(i) + arr.get(j) == target){two[0] = i;two[1] = j;}}}return two;}
}
时间复杂度:O(n) 空间复杂度O(n)
import java.util.HashMap;
class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> arr = new HashMap<Integer, Integer>();for(int i = 0; i < nums.length; i++){if(arr.containsKey(target - nums[i])){return new int[]{arr.get(target - nums[i]),i};}arr.put(nums[i],i);//键放元素,值放索引}return new int[0];}
}
2.字母异位词分组
数组 哈希表 字符串 排序
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
就是拥有相同的字母个数和字母元素
class Solution {public List<List<String>> groupAnagrams(String[] strs) {//创建哈希表对象//键:存放按字母排列的字符串//值:存放string中存在的,与键的字母异位词Map<String,List<String>> map = new HashMap<String, List<String>>();//循环字符串for(String str: strs){//先将字符串转为字符数组char[] array = str.toCharArray();//然后进行排序Arrays.sort(array);//然后将对应的键值存放到哈希表中String key = new String(array);List<String> list = map.getOrDefault(key, new ArrayList<String>());list.add(str);map.put(key,list);}return new ArrayList<List<String>>(map.values());}
}
不会,根据题解写的。
主要思路就是:
把字符串转换为字符数组并排序,将其作为键。
如果其它的字符串的键一样,则将它加到键对应的值数组中。
否则另开一个。
3.最长连续序列
对给定的数列进行排序
有点类似之前写过的数组分段,是说在逻辑上相似
定义一个最大长度和现在记录的连续序列的长度
循环数组,如果当前i不是前一个元素加一,则更新当前的连续序列长度和更新最大长度。
注意跳过重复元素可以减少一点计算。
import java.util.*;public class Solution {public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;Arrays.sort(nums); // 排序int maxLen = 1;int curLen = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) continue; // 跳过重复元素if (nums[i] == nums[i - 1] + 1) {curLen++;} else {maxLen = Math.max(maxLen, curLen);curLen = 1;}}maxLen = Math.max(maxLen, curLen);return maxLen;}
}