java 查找最长连续子序列

背景:

最近工作需要,要给银行查看报关业务持续时间最长的企业,并求出连续年均涨幅,因此需要找出连续的年份,就自己写了个方法:

1,对list排序。

2,将每个连续子序列的起始元素下标和对应的连续长度存到map里。

3,判断是否连续:如果相邻的元素连续,每个元素的值减去对应的下标的差值(interval)肯定是相等的,否则不连续。

public List<Integer> getMaxSeqSubList(List<Integer> list) {
        Collections.sort(list);
        Map<Integer, Integer> map = new HashMap<>();
        int interval = -1;
        int lastIndex = -1;
        for (int i = 0; i < list.size(); i++) {
            if (i == 0) {
                interval = list.get(i) - i;
                map.put(i, 1);
                lastIndex = i;
            } else {
                int thisInv = list.get(i) - i;
                if (thisInv != interval) {
                    map.put(i, 1);
                    lastIndex = i;
                } else {
                    map.put(lastIndex, map.get(lastIndex).intValue() + 1);
                }
                interval = thisInv;
            }
        }
        int maxLen = 0;
        List<Integer> maxList = null;
        for (Entry<Integer, Integer> e : map.entrySet()) {
            if (e.getValue() >= maxLen) {
                maxLen = e.getValue();
                maxList = list.subList(e.getKey(), e.getKey() + e.getValue());
            }
        }
        return maxList;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 描述 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义:最长上升子序...
    6默默Welsh阅读 702评论 1 0
  • SwiftDate概况 从Swift发布起,我们就没有放弃使用Swift。 当然,我们希望在项目能够轻松自如地管理...
    Mee_Leo阅读 10,241评论 1 13
  • (一) 你不来 我不敢走 一不小心 就等到了白头 (二) 我向上帝祈求 让我活到最后 因为我比你坚强 可以承受孤独...
    梦依寒烟醉阅读 402评论 0 2
  • 其实很想念曾经,关于那些人、那些事,不是说忘掉就能忘掉。想念我们曾经肆无忌惮的笑。想念我们曾经的喜怒哀乐。想念我们...
    有一句我替你说阅读 256评论 0 1
  • 今天想和大家分享的,是XXM小姐的故事。别误会,不是她和我的爱情故事。我是女生,虽然性格纯爷们儿,但我不至于口味那...
    REmindmey阅读 903评论 1 3