zoukankan      html  css  js  c++  java
  • 将数组划分成连续子序列 Split Array into Consecutive Subsequences

    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;
        }
    
  • 相关阅读:
    了解委托(Delegate)
    C#中事件的一些总结
    Devexpress Xtrareport 并排报表
    Xtrareport 交叉报表
    Xtrareport 多栏报表
    Xtrareport 报表的一些属性及控件
    UI前端开发都是做什么的以及html、css、php、js等究竟是神马关系
    url,href,src之间的区别
    join()的用法
    爬取百度百科
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/9419892.html
Copyright © 2011-2022 走看看