205. 同构字符串
class Solution {public boolean isIsomorphic(String s, String t) {Map<Character, Character> map1 = new HashMap<>();Map<Character, Character> map2 = new HashMap<>();for (int i = 0, j = 0; i < s.length(); i++, j++) {if (!map1.containsKey(s.charAt(i))) {map1.put(s.charAt(i), t.charAt(j)); // map1保存 s[i] 到 t[j]的映射}if (!map2.containsKey(t.charAt(j))) {map2.put(t.charAt(j), s.charAt(i)); // map2保存 t[j] 到 s[i]的映射}// 无法映射,返回 falseif (map1.get(s.charAt(i)) != t.charAt(j) || map2.get(t.charAt(j)) != s.charAt(i)) {return false;}}return true;}}
242. 有效的字母异位词
用哈希表记录
class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()){return false;}HashMap<Character , Integer> map = new HashMap<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);map.put(c,map.getOrDefault(c,0)+1);}for (int i = 0; i < t.length(); i++) {char c = t.charAt(i);map.put(c,map.getOrDefault(c,0)-1);if (map.get(c) < 0){return false;}}return true;}}
用数组去记录
record数组长度记录为26是因为全是小写字母ASCII表里面26个小写字母是连续的我们只需要记录每一个字母在ASCII表里的一个相对位置即可
class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];for (char c : s.toCharArray()) {record[c - 'a'] += 1;}for (char c : t.toCharArray()) {record[c - 'a'] -= 1;}for (int i : record) {if (i != 0) {return false;}}return true;}}
383. 赎金信
使用哈希表记录
class Solution {public boolean canConstruct(String ransomNote, String magazine) {HashMap<Character, Integer> map = new HashMap<>();for (int i = 0; i < magazine.length(); i++) {char c = magazine.charAt(i);map.put(c,map.getOrDefault(c,0)+1);}for (int i = 0; i < ransomNote.length(); i++) {char c = ransomNote.charAt(i);map.put(c,map.getOrDefault(c,0)-1);if (map.get(c)<0){return false;}}return true;}}
用数组记录
class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) {return false;}int[] cnt = new int[26];for (char c : magazine.toCharArray()) {cnt[c - 'a']++;}for (char c : ransomNote.toCharArray()) {cnt[c - 'a']--;if(cnt[c - 'a'] < 0) {return false;}}return true;}}
49. 字母异位词分组 不会写!记得要看,代码抄的
class Solution { public List> groupAnagrams(String[] strs) { //判断是否为空字符串数组 if(strs == null || strs.length == 0){ return new ArrayList(); } //1.创建一个哈希表 Map
349. 两个数组的交集
import java.util.HashSet;import java.util.Set;class Solution {public int[] intersection(int[] nums1, int[] nums2) {if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {return new int[0];}Set<Integer> set1 = new HashSet<>();Set<Integer> resSet = new HashSet<>();//遍历数组1for (int i : nums1) {set1.add(i);}//遍历数组2的过程中判断哈希表中是否存在该元素for (int i : nums2) {if (set1.contains(i)) {resSet.add(i);}}int[] resArr = new int[resSet.size()];int index = 0;//将结果几何转为数组for (int i : resSet) {resArr[index++] = i;}return resArr;}}
350. 两个数组的交集 II
因为结果要求可重复的数组,这里就不能用HashSet了我们选用数组
class Solution {public int[] intersect(int[] nums1, int[] nums2) {HashMap<Integer, Integer> n1 = new HashMap<>();for (int i : nums1) {n1.put(i,n1.getOrDefault(i,0)+1);}int[] rs = new int[Math.min(nums1.length,nums2.length)];//选用数组int index = 0;for (int i : nums2) {if (n1.containsKey(i) && n1.getOrDefault(i,0) >0){rs[index++] = i;//取出结果n1.put(i,n1.getOrDefault(i,0)-1);}}return Arrays.copyOfRange(rs, 0, index);//截取目标数组}}
202. 快乐数
class Solution {private int getNextNumber(int n) {int res = 0;while (n > 0) {int temp = n % 10;res += temp * temp;n = n / 10;}return res;}public boolean isHappy(int n){HashSet<Integer> set = new HashSet<>();while (n != 1 && !set.contains(n)){set.add(n);n = getNextNumber(n);}return n == 1;}}
1. 两数之和
public int[] twoSum(int[] nums, int target) {int[] res = new int[2];if(nums == null || nums.length == 0){return res;}Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++){int temp = target - nums[i];if(map.containsKey(temp)){res[1] = i;res[0] = map.get(temp);}map.put(nums[i], i);}return res;}
454. 四数相加 II
题目没有要求每个数组只能使用一次
class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {Map<Integer, Integer> map = new HashMap<>();int temp;int res = 0;//统计两个数组中的元素之和,同时统计出现的次数,放入mapfor (int i : nums1) {for (int j : nums2) {temp = i + j;if (map.containsKey(temp)) {map.put(temp, map.get(temp) + 1);} else {map.put(temp, 1);}}}//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数for (int i : nums3) {for (int j : nums4) {temp = i + j;if (map.containsKey(0 - temp)) {res += map.get(0 - temp);}}}return res;}}
总结,看到形如:A+B….+N=0的式子,要转换为(A+…T)=-((T+1)…+N)再计算,这个T的分割点一般是一半,特殊情况下需要自行判断。定T是解题的关键。
15. 三数之和
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) {return result;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while (right > left) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 0) {left++;} else {result.add(Arrays.asList(nums[i], nums[left], nums[right]));while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}return result;}}
求NSum之和时候要是题目没要求返回数组下标而是返回值,都可以用排序 + 双指针。
18. 四数之和
class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (i > 0 && nums[i - 1] == nums[i]) {//注意这里的判断条件continue;}for (int j = i + 1; j < nums.length; j++) {if (j > i + 1 && nums[j - 1] == nums[j]) {continue;}int left = j + 1;int right = nums.length - 1;while (right > left) {int sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum > target) {right--;} else if (sum < target) {left++;} else {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;left++;right--;}}}}return result;}}
