Leetcode Problem -- 697

来源:互联网 发布:被淘宝网店诈骗 编辑:程序博客网 时间:2024/06/06 02:00

问题理解

一个序列中,有些数字会重复出现多次,如果数n重复出现次数最多,那么寻找一个包含所有n的最短子列。

思路

  • 用HashMap存每个数及它出现的次数
  • 对Value排序找到最大出现次数的数(集)
  • 遍历出现次数最多的数集,同时确定其在序列中首次出现的位置pos1,末次出现位置pos2,找到最小的pos2-pos1+1就是问题的答案

分析

  • 时间复杂度O(n)
  • 空间复杂度O(n)
  • 待优化,但是AC了就懒得弄了
        // 有效片段        HashMap<Integer, Integer> hashSet = new HashMap<Integer, Integer>();        for(int num:nums) {            if(hashSet.containsKey(num)) {                int newVal = hashSet.get(num) + 1;                hashSet.put(num, newVal);                           }            else {                hashSet.put(num, 1);             }        }        ArrayList<Integer> arrayList = new ArrayList<Integer>();        int max = 0;        for(int key:hashSet.keySet()) {            if (hashSet.get(key) > max) {                max = hashSet.get(key);            }         }        for(int key:hashSet.keySet()) {            if (hashSet.get(key)== max) {                arrayList.add(key);            }         }        int len = 0, min = 0;        for(int poss:arrayList) {            int pos1 = 0, pos2 = 0;            for (int i = 0; i < nums.length; i++)                if (nums[i] == poss) {                    pos1 = i;                    break;                }            for (int i = nums.length -1; i > 0; i--)                if (nums[i] == poss) {                    pos2 = i;                    break;                }            if(len == 0) {                len = pos2 - pos1 + 1;                min = len;            }else {                len = pos2 - pos1 + 1;                if(len < min)                    min = len;            }        }
原创粉丝点击