题目地址:
https://leetcode.com/problems/two-sum-iii-data-structure-design/
设计一个数据结构,可以执行:
1、添加一个数;
2、给定一个数
n
n
n,判断已经添加的数里是否有两个数的和恰好是
n
n
n。已经添加的数每个数只能用一次。
思路是用哈希表。由于每个数只能用一次,当存在一个数 m m m使得 2 m − n 2m-n 2m−n时,这时为了判断 n n n能否表为 m + m m+m m+m,我们需要存每个数的添加次数。所以要用一个哈希表存每个数添加的次数。代码如下:
import java.util.HashMap;
import java.util.Map;
public class TwoSum {
private Map<Integer, Integer> map;
/**
* Initialize your data structure here.
*/
public TwoSum() {
map = new HashMap<>();
}
/**
* Add the number to an internal data structure..
*/
public void add(int number) {
map.put(number, map.getOrDefault(number, 0) + 1);
}
/**
* Find if there exists any pair of numbers which sum is equal to the value.
*/
public boolean find(int value) {
for (int n : map.keySet()) {
// 如果value要表为两个不同数之和,只需要看一下有没有对应的key即可;
// 如果value要表为两个相同数之和的话,要看一下这个数的count是否大于等于2
if (n != value - n) {
if (map.containsKey(value - n)) {
return true;
}
} else {
if (map.get(n) >= 2) {
return true;
}
}
}
return false;
}
}
添加时间复杂度 O ( 1 ) O(1) O(1),find时间复杂度 O ( n ) O(n) O(n),空间 O ( n ) O(n) O(n)。