zoukankan      html  css  js  c++  java
  • leetcode659. Split Array into Consecutive Subsequences

    leetcode659. Split Array into Consecutive Subsequences

    题意:

    您将获得按升序排列的整数数组(可能包含重复项),您需要将它们拆分成多个子序列,其中每个子序列至少包含3个连续的整数。返回是否可以进行这样的拆分。

    思路:

    虽然是medium,但是我感觉有点难想= =。 O(n)复杂度。
    dp。
    先分开各种不同的序列。按如果间隔大于1就坑定是不同的序列。按此分开不同的序列以此简化问题。
    然后处理连续的序列。连续的序列false的情况就是没有足够的数字构成连续的序列。
    然后转化成一个mp,值为这个数字的个数。
    遍历时用一个one记录以此处为end的序列长度为1的序列。用two记录到此处长度为2的序列。因为贪心的缘故。每次的移动后。因为要尽可能完成一个序列,如果此时这个数字的个数 < one + two的个数。说明这个数字是不够完成one,two要构成连续序列的个数的。所以返回False。two就是上一个的one的值。然后one的值,如果比上个数字的个数大,这个数字的个数和上个数字个数的差。但是如果比上个数字小,那就取零。为了方便,用tot来储存上一个数字的个数。tot表示的含义其实就是要构成序列。下一个数字所必须的长度。

    ac代码:

    C++

    class Solution {
    public:
        bool isPossible(vector<int>& nums) {
            int len = nums.size();
            int k = 0;
            for(int i = 0; i < len; i++)
            {
                if(i > 0 && nums[i] > nums[i - 1] + 1)
                {
                    if(!check(nums,k,i - 1)) return false;
                    else k = i;
                }
            }
            return check(nums,k,len - 1);
        }
    private:
        bool check(vector<int>& nums,int s, int e)
        {
            int n = nums[e] - nums[s] + 1;
            vector<int> mp(n,0);
            
            for(int i = s; i <= e; i++)
            {
                mp[nums[i] - nums[s]]++;
            }
            
            int one, two, tot;
            one = two = tot = 0;
            for(int  i = 0; i < n; i++)
            {
                if(mp[i] < one + two) return false;
                
                two = one;
                one = max(0, mp[i] - tot);
                tot = mp[i];
            }
            return one == 0 && two == 0;
        }
    };
    

    python

    class Solution:
        def isPossible(self, nums):
            """
            :type nums: List[int]
            :rtype: bool
            """
            last = 0
            for i , num in enumerate(nums):
                if i > 0 and nums[i] > nums[i - 1] + 1:
                    if self.check(nums, last, i - 1) == False:
                        return False
                    else:
                        last = i
            return self.check(nums, last, len(nums) - 1)
        
        def check(self, nums, s, e):
            mp = []
            for i in range(nums[e] - nums[s] + 1):
                mp.append(0)
            for i in range(s,e + 1):
                mp[nums[i] - nums[s]] += 1
            
            one = two = tot = 0
            
            for m in mp:
                if m < one + two:
                    return False
                two = one
                one = max(0, m - tot)
                tot = m
            return one == 0 and two == 0
    
    
  • 相关阅读:
    2d向量类 —— js版
    多边形碰撞demo —— 小车撞墙壁
    真累啊——近一年的工作心得
    重力感应相关api
    坐标旋转
    判断web app是否从主屏启动
    “简单就是力量”、“重构”和“架构设计”
    多边形碰撞算法
    《是男人就下一百层》游戏小demo
    优秀的接口的评价标准
  • 原文地址:https://www.cnblogs.com/weedboy/p/7358200.html
Copyright © 2011-2022 走看看