170. Two Sum III - Data structure design

最后更新

二刷。。

其实没那么简单。。。

可以维持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;
	}
}


posted @ 2016-12-23 11:46  哇呀呀..生气啦~  阅读(97)  评论(0编辑  收藏  举报