码迷,mamicode.com
首页 > 编程语言 > 详细

将数组划分成连续子序列 Split Array into Consecutive Subsequences

时间:2018-08-04 21:39:32      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:问题   ons   spl   int   false   return   图片   new   pos   

2018-08-04 20:47:43

问题描述:

技术分享图片

问题描述:

本题需要的是将一个数组划分成子序列,保证每个子序列是连续的,并且长度要大于等于3。

解题思路是使用贪心算法,首先对数组中的数字进行计数,然后遍历数组,对每个数字,如果说candidate中有这个数字,那么意味着它可以和之前的子序列组成更长的序列,直接将之添加到先前的子序列中即可。如果说candidate中没有当前的数字,那么当前的数字只能作为序列的首数字出现。如果这两个都不满足,那么直接判false。

    public boolean isPossible(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        Map<Integer, Integer> candidate = new HashMap<>();
        for (int i : nums) map.put(i, map.getOrDefault(i, 0) + 1);
        for (int i = 0; i < nums.length; i++) {
            if (map.get(nums[i]) == 0) continue;
            if (candidate.getOrDefault(nums[i], 0) > 0) {
                candidate.put(nums[i], candidate.get(nums[i]) - 1);
                candidate.put(nums[i] + 1, candidate.getOrDefault(nums[i] + 1, 0) + 1);
            }
            else if (map.getOrDefault(nums[i] + 1, 0) > 0 && map.getOrDefault(nums[i] + 2, 0) > 0) {
                map.put(nums[i] + 1, map.get(nums[i] + 1) - 1);
                map.put(nums[i] + 2, map.get(nums[i] + 2) - 1);
                candidate.put(nums[i] + 3, candidate.getOrDefault(nums[i] + 3, 0) + 1);
            }
            else return false;
            map.put(nums[i], map.get(nums[i]) - 1);
        }
        return true;
    }

 

将数组划分成连续子序列 Split Array into Consecutive Subsequences

标签:问题   ons   spl   int   false   return   图片   new   pos   

原文地址:https://www.cnblogs.com/TIMHY/p/9419892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!