599. Minimum Index Sum of Two Lists

寻找两个人都喜欢的餐厅的minimum index sum。

Example :
Input:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["KFC", "Shogun", "Burger King"]
Output: ["Shogun"]
Explanation: The restaurant they both like and have the least index sum is "Shogun" with index sum 1 (0+1).

这题我一开始想用两个指针来查找的,想了一下复杂度是O(n2)(嵌套的for循环),而且也需要额外空间保存多个餐厅。所以如果先把第一个人喜欢的餐厅的index保存起来,再用第二个人喜欢的餐厅去get(key)匹配,这样复杂度是O(n)。

写的时候发现,只能保存当前最优啊。于是我还用了Iterator去查找entry.getValue() == minSum的key保存到arraylist里,最后还有个arraylist转array的操作。。AC了,但实在是冗长:
我的代码:

    public String[] findRestaurant(String[] list1, String[] list2) {
        int minSum = Integer.MAX_VALUE;
        HashMap map = new HashMap<>();
        //SparseArray
        HashMap curMin = new HashMap<>();
        for (int i = 0; i < list1.length; i++) {
            map.put(list1[i], i);
        }

        for (int j = 0; j < list2.length; j++) {
            if (map.get(list2[j]) != null) {
                if (j + map.get(list2[j]) <= minSum) {
                    minSum = j + map.get(list2[j]);
                    curMin.put(list2[j], minSum);
                }
            }
        }
//traverse the hashmap 
        ArrayList res = new ArrayList<>();
        Iterator iterator = curMin.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            if ((Integer) entry.getValue() == minSum) {
                res.add((String) entry.getKey());
            }
        }
        return res.toArray(new String[res.size()]);
    }

其实呢,可以用类似DFS遍历二叉树输出每一层节点的那种方法,把每次得到的minSum再做key,保存到arraylist>里去(大雾),这样不行的,因为arraylist的查找是O(n)时间 没什么区别。

看了别人的答案:

public String[] findRestaurant(String[] list1, String[] list2) {
    Map map = new HashMap<>();
    List res = new LinkedList<>();
    int minSum = Integer.MAX_VALUE;
    for (int i=0;i(); minSum = i+j; }
            res.add(list2[i]);
        }
    }
    return res.toArray(new String[res.size()]);
}

他的思路是,如果遇到index sum相同的饭店,就保存起来;如果遇到index sum更小的饭店,就把这个res清空,更新minSum,重新开始保存。

今天写了简历,一个日本猎头问我是否available to talk,我回复说yes,她立刻从日本打电话过来。。英文聊了15分钟,我竟然全都听懂了,还蛮开心的。就是她跟我说80%的人都跪在了面试之前的笔试上,让我觉得有些难受了。。虽然早已经做好了送人头的准备。不管怎么说,算是迈出了这么一步。Always, good luck, Larry!
29 May 2017

你可能感兴趣的:(599. Minimum Index Sum of Two Lists)