242. 有效的字母异位词
题目链接:242. 有效的字母异位词
思路:哈希法。利用数组来记录出现的字母个数,然后判断是否为字母异位词。
时间复杂度:O(n)
class Solution {public boolean isAnagram(String s, String t) {int[] count = new int[26];for (int i = 0; i < s.length(); i++) {// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了count[s.charAt(i) - 'a']++;}for (int i = 0; i < t.length(); i++) {count[t.charAt(i) - 'a']--;}for (int i : count) {// record数组如果有的元素不为零0,// 说明字符串s和t一定是谁多了字符或者谁少了字符。if (i != 0) {return false;}}// record数组所有元素都为零0,说明字符串s和t是字母异位词return true;}
}
349. 两个数组的交集
题目链接:349. 两个数组的交集
思路:哈希法。利用HashSet
集合来判断元素是否存在,set集合判断元素是否存在的时间复杂度为O(1)
。注意,这里涉及将集合转换为int数组的操作。
时间复杂度:O(n)
class Solution {public int[] intersection(int[] nums1, int[] nums2) {// 存入set,然后遍历setSet<Integer> set1 = new HashSet<>();Set<Integer> result = new HashSet<>();for (int num : nums1) {set1.add(num);}for (int num : nums2) {if (set1.contains(num)) {result.add(num);}}// 将结果集合转为数组// return result.stream().mapToInt(x -> x).toArray();int[] res = new int[result.size()];int i = 0;for(int num : result){res[i] = num;i++;}return res;}
}
202. 快乐数
题目链接:202. 快乐数
思路:哈希法加数值各个位上的单数操作,使用HashSet
集合来检测是否循环。
时间复杂度:里面while循环的时间复杂度为O(logn)
,因为数字的位数由logn
决定。
class Solution {public boolean isHappy(int n) {Set<Integer> set = new HashSet<>();int sum = 0;while (n != 1) {// 取数值各个位上的单数平方之和while (n != 0) {sum += Math.pow(n % 10, 2);n = n / 10;}// 如果这个sum曾经出现过,说明已经陷入了无限循环了if (set.contains(sum)) {return false;}set.add(sum);n = sum;sum = 0;}return true;}
}
1. 两数之和
题目链接:1. 两数之和
思路:哈希法,使用HashMap
集合key存放元素value存放下标,遍历一遍数组,判断Map集合中是否有符合条件的元素,如果有,返回两个元素的下标,每次判断结束要将当前元素值和下标存放进Map集合。注意,为了防止当前元素也是符合条件的元素(即两个当前元素相加为目标值)导致的两个下标相同,所以要在判断结束之后再将当前元素和下标放进Map集合。
时间复杂度:O(n)
class Solution {public int[] twoSum(int[] nums, int target) {// 维护 val -> index 的映射HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {// 查表,看看是否有能和 nums[i] 凑出 target 的元素int need = target - nums[i];if (map.containsKey(need)) {return new int[]{map.get(need), i};}// 存入 val -> index 的映射map.put(nums[i], i);}return null;}
}