代码随想录算法训练营第七天 | LeetCode454 四数相加Ⅱ、LeetCode 383赎金信、LeetCode 15 三数之和、 LeetCode 18. 四数之和
)
LeetCode454 四数相加
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer, Integer> myMap1 = new HashMap<>();
Map<Integer, Integer> myMap2 = new HashMap<>();
for(int i : nums1 ) {
for(int j : nums2) {
int temp = i + j;
if(myMap1.containsKey(temp)){
myMap1.replace(temp, myMap1.get(temp) + 1);
} else {
myMap1.put(temp, 1);
}
}
}
for(int i : nums3) {
for(int j : nums4){
int temp = 0 -( i + j);
if(myMap1.containsKey(temp)){
res += myMap1.get(temp);
}
}
}
return res;
}
LeetCode 383 赎金信
public boolean canConstruct(String ransomNote, String magazine) {
if(magazine.length() < ransomNote.length()){
return false;
}
int[] res = new int[26];
for(char ch : magazine.toCharArray()){
res[ch-'a']++;
}
for(char ch : ransomNote.toCharArray()){
res[ch-'a']--;
if(res[ch- 'a'] < 0){
return false;
}
}
return true;
}
LeetCode 15三数之和
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){
if(nums[i] + nums[left] + nums[right] > 0) {
right--;
} else if(nums[i] + nums[left] + nums[right] < 0) {
left++;
}else{
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
while(right > left && nums[left] == nums[left + 1]) {
left++;
}
while(right > left && nums[right] == nums[right -1]){
right--;
}
right--;
left++;
}
}
}
return result;
}
LeetCode 18. 四数之和
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(nums[i] > target && nums[i] >=0){
break;
}
if(i > 0 && nums[i] == nums[i -1]){
continue;
}
for(int j = i + 1; j< nums.length; j++){
if(nums[i] + nums[j] > target && nums[i] >= 0){
break;
}
if(j > i +1 && nums[j] == nums[j-1]){
continue;
}
int left = j + 1;
int right = nums.length -1;
while(left < right){
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++;
}
right--;
left++;
}
}
}
}
return result;
}
今日总结:
哈希函数是把key映射到存储元素的数组的索引上
数组, map, set都具有hash结构
注意它们的区别,以及底层
是否排序对算法的影响蛮大的