454:
时间复杂度: O(n^2)
空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res=0;
Map<Integer,Integer> map=new HashMap<>();
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;
}
383:
哈希解法:题目中说只有小写字母,可以用长度为26的数组。Map的话其实是更耗时的。
将String转为char数组。s.toCharArray()。
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 i:record){
if(i<0){
return false;
}
}
return true;
}
15:这道题要注意去重,刚看了两数之和,感觉用双指针也行。
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(left<right){
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[left]==nums[left+1]){
left++;
}
while(right>left&&nums[right]==nums[right-1]){
right--;
}
left++;
right--;
}
}
}
return res;
}
18:跟三数之和一样的思路,注意剪枝的时候。
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]>target&&(nums[i]>=0||target>=0)){
// return res;
// }
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 sum = nums[i]+nums[j];
int left=j+1;
int right=nums.length-1;
// if(sum>target&&(sum>=0||target>=0)){
// return res;
// }
while(right>left){
long s=(long)nums[i]+nums[j]+nums[left]+nums[right];
if(s>target){
right--;
}else if(s<target){
left++;
}else{
res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(right>left&&nums[left]==nums[left+1]){left++;}
while(right>right&&nums[right]==nums[right-1]){right--;}
right--;
left++;
}
}
}
}
return res;
}