Leetcode739 Daily Temperatures

首先想到暴力解法,方法1:

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] results = new int[temperatures.length];
        for(int i=0;i<temperatures.length;i++) {
            int days = 0;
            for(int j=i+1;j<temperatures.length;j++) {
                days++;
                if(temperatures[j]>temperatures[i]) {results[i]=days;break;}
            }
        }
        return results;
    }
}

效果可以说是十分的差了,然后想办法改进,发现可以使用map存储没有处理的数,在一次遍历中完成,但是最坏的情况下时间复杂度其实并没有降低,最终实测由于set相关操作较慢,还超时了,但是有些东西还是有价值的,故记录一下,方法2(并不能AC):

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] result = new int[temperatures.length];
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0, temperatures[0]);
        Set<Map.Entry<Integer, Integer>> set = map.entrySet();
        for(int i=1;i<temperatures.length;i++) {
//            for(int k:set) {        //java.util.ConcurrentModificationException因为之后更改了迭代条件set
//            if(temperatures[i]>k) {
//                int v = map.get(k);
//                result[v]=i-v;
//                map.remove(k);
//            }
//        }
        //ConcurrentModificationException Solution1:用Iterator的remove;Solution2:用/ConcurrentHashMap(貌似叫这个名字)
            Iterator<Map.Entry<Integer, Integer>> iter = set.iterator();
            while(iter.hasNext()) {
                Map.Entry<Integer, Integer> n = iter.next();
                int v = n.getValue();
                if(temperatures[i]>v) {
                    int k = n.getKey();
                    result[k] = i-k;
                    iter.remove();
                }
            }
            map.put(i, temperatures[i]);
        }
        return result;
    }
}

猜你喜欢

转载自www.cnblogs.com/chason95/p/9293428.html