今日任务
454.四数相加II
383. 赎金信
15. 三数之和
18. 四数之和
哈希表总结:
一般来说哈希表都是用来快速判断一个元素是否出现集合里。
了解什么是哈希表,哈希函数,哈希碰撞,已经常见的三种哈希表:数组,set和map
454.四数相加II
题目链接:. - 力扣(LeetCode)
使用hashmap
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer,Integer> map1 = new HashMap<Integer, Integer>();
int res = 0;
for (int i = 0; i < nums1.length; i++){
for (int j = 0; j < nums2.length; j++) {
int key = nums1[i] + nums2[j];
map1.put(key, map1.getOrDefault(key, 0) + 1);
}
}
for (int i = 0; i < nums3.length; i++) {
for (int j = 0; j < nums4.length; j++) {
int key = 0 - nums3[i] - nums4[j];
res += map1.getOrDefault(key, 0);
}
}
return res;
}
}
383. 赎金信
题目链接:. - 力扣(LeetCode)
使用hashmap和数组都可以,不过从效率讲,有限用数组。
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] intArray = new int[26];
Arrays.fill(intArray, 0);
for (int i = 0; i < magazine.length(); i++) {
intArray[magazine.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < ransomNote.length(); i++) {
intArray[ransomNote.charAt(i) - 'a'] -= 1;
if (intArray[ransomNote.charAt(i) - 'a'] < 0) {
return false;
}
}
return true;
}
}
hashmap方式
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < magazine.length(); i++) {
map.put(magazine.charAt(i), map.getOrDefault(magazine.charAt(i), 0) + 1);
}
for (int i = 0; i < ransomNote.length(); i++) {
if (map.containsKey(ransomNote.charAt(i))) {
int num = map.get(ransomNote.charAt(i));
if (num > 1) {
map.put(ransomNote.charAt(i), --num);
} else {
map.remove(ransomNote.charAt(i));
}
}else {
return false;
}
}
return true;
}
}
15. 三数之和
题目链接:. - 力扣(LeetCode)
双指针+set;利用增加空间的方式,利用set来保存满足条件的三个数字
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Set<String> set = new HashSet<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
return result;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else {
String temp = "" + nums[i] + nums[left] + nums[right];
if (!set.contains(temp)) {
set.add(temp);
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
}
right--;
left++;
}
}
}
return result;
}
}
18. 四数之和
题目链接:. - 力扣(LeetCode)
双指针+set: 注意便捷条件,当4个1000000000相加的时候超过了int的范围,发生溢出,需要强转成long类型。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Set<String> set = new HashSet<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int left = j + 1;
int right = nums.length - 1;
while (left < right) {
long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
if (sum > (long)target) {
right--;
} else if (sum < target) {
left++;
} else {
String temp = "" + nums[i] + nums[j] + nums[left] + nums[right];
if (!set.contains(temp)) {
set.add(temp);
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
}
left++;
right--;
}
}
}
}
return result;
}
}