454.四数相加II
1.题目描述
2.适用场景
- 时间复杂度: O(n^2)
- 空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2
3.做题思路
- 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
- 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 count 就可以了
4.代码实现
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i : nums1){
for(int j : nums2){
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
for(int i :nums3){
for(int j : nums4){
res += map.getOrDefault(0 - i - j, 0);
}
}
return res;
}
}
5.总结
383. 赎金信
1.题目描述
2.适用场景
- 时间复杂度: O(n)
- 空间复杂度: O(1)
3.做题思路
不难
4.代码实现
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] record = new int[26];
if(magazine.length() < ransomNote.length()){
return false;
}
for(char a : magazine.toCharArray()){
record[a - 'a']++;
}
for(char c : ransomNote.toCharArray()){
record[c - 'a']--;
}
for(int i : record){
if(i < 0){
return false;
}
}
return true;
}
}
5.总结
字符串在 Java 中是不可变的,将其转换为字符数组可以方便地对每个字符进行遍历操作。
15. 三数之和
1.题目描述
2.适用场景
- 时间复杂度: O(n^2)
- 空间复杂度: O(1)
3.做题思路
4.代码实现
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){
left++;
}
else if(sum > 0){
right--;
}
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;
}
}
5.总结
Arrays.asList()
函数
sort函数
18. 四数之和
1.题目描述
2.适用场景
3.做题思路
和上个差不多,剪枝上有区别。