两数之和
题目:LeetCode.1
接口:java.util.Map
实现:
java.util.HashMap<K, V>
:哈希表java.util.TreeMap<K, V>
:平衡树
函数:
-
put(key, value)
:添加关键字和其对应的值 -
get(key)
:返回关键字对应的值 -
containsKey(key)
:是否包含关键字 -
remove(key)
:删除关键字 -
size()
:返回元素数 -
isEmpty()
:是否为空 -
clear()
:清空 -
entrySet()
:获取Map中的所有对象的集合 -
Map.Entry<K, V>
:Map中的对象类型-
getKey()
:获取关键字 -
getValue()
:获取值
-
import java.util.*;
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arr = new int[2];//存结果
if(nums == null || nums.length == 0){
return arr;
}
Map<Integer, Integer> res = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int tmp = target - nums[i];
if(res.containsKey(tmp)){
arr[1] = i;
arr[0] = res.get(tmp);
}
res.put(nums[i], i);
}
return arr;
}
}
四数相加Ⅱ
题目:LeetCode.454
本题使用的是哈希法,题目中没有排除重复。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> map = new HashMap<>();
int cnt = 0;
for (int i : nums1){
for (int j : nums2){
int tmp1 = i + j;
if (!map.containsKey(tmp1)){
map.put(tmp1,1);
}
else{
map.put(tmp1, map.get(tmp1) + 1);
}
}
}
for (int i : nums3){
for (int j : nums4){
int tmp2 = i + j;
if(map.containsKey(-tmp2)){
cnt += map.get(-tmp2);
}
}
}
return cnt;
}
}
赎金信
题目:LeetCode.383
使用map的做法
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<>();
for (char c : magazine.toCharArray()){
if (!map.containsKey(c)){
map.put(c,1);
}
else{
map.put(c, map.get(c) + 1);
}
}
for (char c : ransomNote.toCharArray()){
if (map.containsKey(c)){
map.put(c, map.get(c) - 1);
if (map.get(c) < 0) return false;
}
else return false;
}
return true;
}
}
三数之和
题目:LeetCode.15
接口:java.util.List<>
实现:
java.util.ArrayList<>
:变长数组java.util.LinkedList<>
:双链表
函数
add()
:在末尾添加一个元素clear()
:清空size()
:返回长度isEmpty()
:是否为空get(i)
:获取第i个元素set(i, val)
:将第i个元素设置为val
本题的关键是去重。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);//从小到大排序
for(int i = 0 ; i < nums.length ; i++){
if(nums[i] > 0) return list;//优化
if(i > 0 && nums[i] == nums[i - 1]) continue;//去重
int l = i + 1;
int r = nums.length - 1;
while (l < r){
int sum = nums[i] + nums[l] + nums[r];
if (sum == 0){
List<Integer> newlist = new ArrayList<>();
newlist.add(nums[i]);
newlist.add(nums[l]);
newlist.add(nums[r]);
list.add(newlist);
while(l < r && nums[r - 1] == nums[r]) r--; //去重
while(l < r && nums[l + 1] == nums[l]) l++;//去重
r--;
l++;
}
else if (sum > 0) r--;
else l++;
}
}
return list;
}
}
四数之和
题目:LeetCode.18
和三数之和整体思维一样,注意是两层for循环,注意去重。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0 ; i < nums.length ; i++){
if(nums[i] > 0 && nums[i] > target) return list;//注意target的取值可能为负数
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 l = j + 1;
int r = nums.length - 1;
while (l < r){
int sum = nums[i] + nums[j] + nums[l] + nums[r];
if(sum == target){
List<Integer> newlist = new ArrayList<>();
newlist.add(nums[i]);
newlist.add(nums[j]);
newlist.add(nums[l]);
newlist.add(nums[r]);
list.add(newlist);
while (l < r && nums[l] == nums[l + 1]) l++;
while (l < r && nums[r] == nums[r - 1]) r--;
l++;
r--;
}
else if (sum < target) l++;
else r--;
}
}
}
return list;
}
}