hash表【数组、map】以及双指针的运用
454.四数相加II
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//nums1,nums2的和作为key,出现次数记位value
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int a : nums1){
for(int b: nums2){
int sum = a+b;
map.put(sum,map.getOrDefault(sum,0)+1);
}
}
int sum = 0;
for(int a : nums3){
for(int b: nums4){
sum += map.getOrDefault(0-a-b,0);
}
}
return sum;
}
- 赎金信
public boolean canConstruct(String ransomNote, String magazine) {
if(ransomNote.length() > magazine.length()){
return false;
}
int[] record = new int[26];
for(int i = 0; i< magazine.length(); i++){
record[magazine.charAt(i) - 'a']++;
}
for(int i = 0; i< ransomNote.length(); i++){
record[ransomNote.charAt(i) - 'a']--;
}
for(int ele: record){
if(ele < 0) return false;
}
return true;
}
- 三数之和
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0; i< nums.length; i++){
if(nums[i] > 0){
return res;
}
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{
res.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 ++ ;
left++;
right--;
}
}
}
return res;
}
- 四数之和
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0; i< nums.length; i++){
if(nums[i] > 0 && nums[i] > target){
return res;
}
if(i> 0&& nums[i] == nums[i- 1]){
continue;
}
for(int j=i+1; j< nums.length; j++){
if(j> i+1&& nums[j] == nums[j- 1]){
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{
res.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 res;
}
}