leetcode 659. Split Array into Consecutive Subsequences

659. Split Array into Consecutive Subsequences

You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.

Example 1:

Input: [1,2,3,3,4,5]
Output: True
Explanation:
You can split them into two consecutive subsequences : 
1, 2, 3
3, 4, 5

Example 2:

Input: [1,2,3,3,4,4,5,5]
Output: True
Explanation:
You can split them into two consecutive subsequences : 
1, 2, 3, 4, 5
3, 4, 5

Example 3:

Input: [1,2,3,4,4,5]
Output: False

Note:

  1. The length of the input is in range of [1, 10000]

1、这个题的方式就是构造出拆分后的情况。

2、构造方式是从最后一行最后一个来看:

如果是nums[i] = vv[row-1][col-1] + 1 ,刚好加在后面

如果是nums[i] = vv[row-1][col-1] 。那就往上面找,看能否加在某个序列后面 。如果不行就新建序列。

3、最后挨个看序列的长度。


class Solution {
public:
    bool isPossible(vector<int>& nums) 
    {
        if (nums.size() < 3) return false;
        vector<vector<int>> vv(1, vector<int>(1, nums[0]));
        for (int i = 1; i < nums.size(); i++)
        {
            int row = vv.size();
            if (nums[i] == vv[row-1][vv[row-1].size() - 1] + 1)
            {
                vv[row-1].push_back(nums[i]);
                continue;
            }
            else if (nums[i] == vv[row-1][vv[row-1].size() - 1])
            {
                int now_row = row;
                while (now_row >= 1 && nums[i] == vv[now_row-1][vv[now_row-1].size() - 1])
                {
                    now_row --;
                }
                
                if (now_row == 0 || nums[i] != vv[now_row-1][vv[now_row-1].size() - 1] + 1) //当到了最上面 或者 不能加在当前行 需要重新启动一行
                {
                    vv.push_back(vector<int>(1, nums[i]));
                    continue;
                }
                else  //往上面找 找到了与当前行前面 相等的。 且可以加在后面
                {
                        vv[now_row-1].push_back(nums[i]);
                        continue;   
                }
            }
        }
        
        for (auto it : vv)
        {
            if (it.size() < 3)
                return false;
        }
        return true;    
    }
};




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值