四个独立的数组,不用考虑去重的操作,使用hash法解题。定义一个map,用来存储nums1和nums2相加的结果,相加之和做key,出现的次数做value。遍历nums3和nums4并相加,判断map中是否存在相加结果为0的key,若存在,取对应的value并相加。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int result = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
int sum = nums1[i] + nums2[j];
map.putIfAbsent(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];
int temp = 0 - sum;
if (map.containsKey(temp)) {
result += map.get(temp);
}
}
}
return result;
}
}
定义一个26大小的数组,遍历magazine,在对应的字符位做自增操作。然后遍历字符串ransomNote,在对应的字符位做自减操作,最后遍历数组,若数组中出现负数返回false,否则返回true
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] result = new int[26];
for (char c : magazine.toCharArray()) {
result[c - 'a'] += 1;
}
for (char c : ransomNote.toCharArray()) {
result[c - 'a'] -= 1;
}
for (int i : result) {
if (i < 0) {
return false;
}
}
return true;
}
}
使用双指针思想解题,从数组下标0开始遍历,i+1赋值给left,nums.lengs赋值给right。若nums[i]+nums[left]+nums[right] > 0 right--,若nums[i]+nums[left]+nums[right] < 0 left--。
需要注意元素去重。
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++) {
// 去除a
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
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[right] == nums[right - 1]) {
right--;
}
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
left++;
right--;
}
}
}
return result;
}
}