leetcode hot100_part01_哈希
1.两数之和
遍历数组,map中存在target - nums[i]就返回结果,不存在就把当前元素存入map;
49.字母异位词分组
分组,怎么分,用hashMap, key为每一组的标识,value为每一组包含的字符串(属于同一组的);那么key就有两种选择了
key可以是某一组中某个字符串排好序的字符串x,遍历每个字符串,排序如果和x一样,加入该分组;否则就是一个新的分组
key可以用某组字符串的特征构造新的字符串,遍历,对于串s,获取它的每个字符出现的次数,比如abbc,对应的分组的key就是a1b2c3(字母+出现次数);对于后续的某个串如果拆解后和key一样,就是一组,否则是新的一组;
128.最长连续序列
9/11
假设数排好了序,那么会有很多的连续序列,我们对其中一个序列统计长度时,要从头开始统计,才可以在遍历过程中对每个序列只统计一次; 如果从中间开始统计效率就太低了,遍历到某个序列的不同元素时,都会对这个序列进行统计;
还有就是,对于哈希表里的重复元素,看示例2,001的最长连续序列算2
之前的做法:
4/14/2024
这是前两天做一半的题目了。这题给我的教训就是用哈希表的时候一定一定要考虑重复元素的问题!!!!
这题让我想到了最长递增子序列,只是名字有点像。子序列和子数组还不一样一个连续一个不连续。自己一开始的做法是把每个元素作为key,是否被访问过作为value来存入hash表里,然后对数组元素进行遍历,访问了首先value为true,然后双指针分别标记前一个数 nums-1 和后一个数nums+1 ,分别向前和向后迭代更新,指针相减即为长度,迭代最大长度即可。
注意boolean的布尔类型为Boolean
一个for循环引发的错误,但是你这个方法也好慢啊。。
class Solution {
public int longestConsecutive(int[] nums) {
HashMap<Integer, Boolean> hash = new HashMap<>();
int res = 0;
for(int x : nums){
hash.put(x, false);
}
for(int i = 0; i < nums.length; i++){
// 原来的这个if条件写在了for循环的条件里
// 这样不就只找了一次,
if(hash.get(nums[i]) == false){
//我说怎么慢,访问这个元素也要改为true,之前忘了
hash.replace(nums[i], true);
int low = 0;
int fast = 0;
int cur = nums[i];
while(hash.containsKey(cur - 1)){
low--;
hash.replace(cur - 1, true);
cur = cur - 1;
}
// 重置cur;
// 相同元素?
cur = nums[i];
while(hash.containsKey(cur + 1)){
fast++;
hash.replace(cur + 1, true);
cur = cur + 1;
}
int p = fast - low + 1;
res = res > p ? res : p;
}
else continue;
}
return res;
}
}