哈希表:key值作为下标,查找的时间复杂度为O(1),经典的用空间换时间。
对于set、multiset和unordered_set:如果面对的是哈希问题,优先考虑unordered_set;如果数据是有序的,优先考虑set;如果数据即是有序的,又是重复的,则考虑multiset。
242.有效的字母异位词
题目链接:242.有效的字母异位词
思路1:将两个字符串排序,然后判断两个字符串是否相等即可。然而在java中字符串排序需要先将字符串转换为char型数组,然后使用sort方法,方能完成数组排序。
class Solution {
public boolean isAnagram(String s, String t) {
char[] char1 = s.toCharArray();
char[] char2 = t.toCharArray();
Arrays.sort(char1);
Arrays.sort(char2);
s = new String(char1);
t = new String(char2);
if(s.equals(t)){
return true;
}
else{
return false;
}
}
}
思路2:利用哈希表(数组),遇到字符串中的字母,即将对应下标的value值+1;接下来的过程,可以有两种方式,一种是使用一个表,对于s来说进行加1统计,对于t来说,每遇到一次,在表内减1.最后查看表内有无非零值;另一种是使用两个表,每个表都只做加一操作,最后比较两个表每个下标位置的值是否全部相等。
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for(int i = 0; i < s.length(); i++){
record[s.charAt(i) - 'a']++;
}
for(int i = 0; i < t.length(); i++){
record[t.charAt(i) - 'a']--;
}
for(int i = 0; i < record.length; i++){
if(record[i] != 0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
题目链接:349. 两个数组的交集
思路:判断元素是否出现过,选择用哈希表。先用无重复的哈希表为nums1去重,然后再遍历nums2,判断nums2中的元素是否出现过,得到去重后的交集。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int i : nums1){
set1.add(i);
}
for(int i : nums2){
if(set1.contains(i)){
result.add(i);
}
}
return result.stream().mapToInt(x -> x).toArray();
}
}
202. 快乐数
题目链接:202. 快乐数
思路:对于每个n求其相应位上数的平方和,得到新的n值,如果n==1,则为快乐数。由于存在死循环问题,所以一定要做好记录,已经出现过的n值不能再出现,否则就进入循环中了。
class Solution {
public boolean isHappy(int n) {
Set<Integer> set1 = new HashSet<>();
while( n != 1 && !set1.contains(n)){
set1.add(n);
int res = 0;
while(n > 0){
int temp = n % 10;
res += temp * temp;
n /= 10;
}
n = res;
}
return n == 1;
}
}
1. 两数之和
题目链接:1. 两数之和
思路:创建一个map,用来存放nums1中的元素值和元素下标。key = 元素值,value = 元素下标;依次遍历nums,如果key = target - nums[i],在map中能找到,就说明已经满足条件,返回两个数的下标即可。如果key = target - nums[i]没能在map中找到,那么将其放入到map中。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0; i < nums.length; i++){
if(!map.containsKey(target - nums[i])){
map.put(nums[i],i);
}
else{
return new int []{map.get(target - nums[i]),i};
}
}
return null;
}
}