最后更新
二刷。。
其实没那么简单。。。
可以维持2个set,一个是所有的elements,一个存放可组合的所有sum,每次add的时候更新2个set,这样find是O(1),然而TLE了。。
另一个做法是添加直接加,然后查的时候看看能不能组合出来所需要的值。
edge case着实难想到= = add(0) find(0)是false。。
一个元素似乎只能用一次。。
public class TwoSum {
Map<Integer, Integer> 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) {
Iterator<Integer> iter = map.keySet().iterator();
while (iter.hasNext()) {
int temp = iter.next();
if (map.containsKey(value - temp)) {
if (value - temp != temp || map.get(value - temp) > 1) {
return true;
}
}
}
return false;
}
}
还不如一刷做得好。。
不用记录每个元素有几个,记录是不是多余1个就行了,像一刷那样。
一刷
主要是add2 add2 find4这种重复的情况需要注意。。
public class TwoSum {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
// Add the number to an internal data structure.
public void add(int number)
{
if(map.containsKey(number))
{
map.put(number,2);
}
else
{
map.put(number,1);
}
}
// Find if there exists any pair of numbers which sum is equal to the value.
public boolean find(int value)
{
for(Integer i: map.keySet())
{
int need = value - i;
if(map.containsKey(need))
{
if(need == i)
{
if(map.get(i) == 2) return true;
}
else
{
return true;
}
}
}
return false;
}
}