题目1:【二刷完成】
代码1:
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//选取合适的结构存储数据很重要
//这里选择map
int record = 0;
Map<Integer, Integer> map = new HashMap<>();
int sum = 0;
for (int i : nums1){
for (int j : nums2){
sum = i + j;
map.put(sum, map.getOrDefault(sum, 0)+1);
}
}
for (int i : nums3){
for (int j : nums4){
//record是记录的map中value的值,而不只是简单的count++
record += map.getOrDefault(0-i-j,0);
}
}
return record;
}
}
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int count = 0;
int target = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0;i<nums1.length;i++){
for (int j=0;j<nums2.length;j++){
int sum = nums1[i]+nums2[j];
map.put(sum,map.getOrDefault(sum,0)+1);
}
}
for (int i=0;i<nums3.length;i++){
for (int j=0;j<nums4.length;j++){
int sum = nums3[i]+nums4[j];
count = count + map.getOrDefault(target-sum,0);
}
}
return count;
}
}
题目2:【二刷完成】
代码2:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
//使用的是哈希数组
int[] array =new int[26];
if (ransomNote.length() > magazine.length()){
return false;
}
//要记得将字符串先转换成一个字符串数组,才能进行 - 'a' 的操作
for (char c : magazine.toCharArray()){
array[c - 'a'] ++;
}
for (char c : ransomNote.toCharArray()){
array[c -'a'] --;
}
for (int i=0;i<array.length;i++){
if (array[i]<0){
return false;
}
}
return true;
}
}
题目3:【二刷完成】
代码3:
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;//因为排序后的第一个元素大于0,则没有满足三元素之和=0的要求
}
//需要对第一个元素进行去重的操作
if (i>0 && nums[i]==nums[i-1]){
continue;
}
int left = i+1;
int right = nums.length-1;
while(left<right){
int a = nums[i] + nums[left] + nums[right];
if (a>0){
right--;
}else if (a<0){
left++;
}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;
}
}
题目4:【二刷完成】
代码4:
class Solution {
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]>0 && nums[i]>target){
return result;
}
//对第一个元素去重
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;
}
long a = nums[i] + nums[j];
int right = nums.length-1;
int left = j+1;
while(left<right){
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum < target){
left++;
}else if (sum > target){
right--;
}else{
result.add(Arrays.asList(nums[i],nums[j],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 result;
}
}