leetcode 分割数组为连续子序列(将元素分配到几个集合里面)

博客探讨了在处理涉及连续整数的问题时如何利用排序和哈希表策略来划分数组元素成多个子序列。通过分析元素是否能接在其他序列后面或自成一派,实现了nums数组的有效划分。代码示例展示了如何使用两个哈希表freq和need辅助实现这一逻辑,确保数组正确划分为[1,2,3,4,5]和[5,6,7]。
摘要由CSDN通过智能技术生成

在这里插入图片描述

  1. 对于涉及连续整数的问题,应该条件反射想到排序
  2. 想把nums的元素划分到若干个子序列,就是如下代码逻辑:
for(int v : nums){
	if(...){
		//将v分配到某个序列中
	}else{
		//实在无法分配v
		return false;
	}
	return true;
}

然后对v进行分配,总共有如下两种情况:

  1. 当前v自成一派,[以自己开头]可构成一个长度至少为3的序列
  2. 当前元素v接到已经存在的子序列后面
    如果这两种情况都满足,哪种情况需要优先考虑呢?

比如说,输入nums = [1,2,3,4,5,5,6,7],对于元素4,你说它应该形成一个新的子序列[4,5,6]还是接到子序列[1,2,3]后面呢?

显然,nums数组的正确划分方法是分成[1,2,3,4,5][5,6,7],所以元素4应该优先判断自己是否能够接到其他序列后面,如果不行,再判断是否可以作为新的子序列开头。

这就是整体的思路,想让算法代码实现这两个选择,需要两个哈希表来做辅助:

freq哈希表帮助一个元素判断自己是否能够作为开头,need哈希表帮助一个元素判断自己是否可以被接到其他序列后面。

class Solution {
public:
    bool isPossible(vector<int>& nums) {
        unordered_map<int, int> freq, need;
        
        for(int v : nums) freq[v]++;
        
        for(int v : nums){
            if(freq[v] == 0){
                //已经被用到其它子序列中
                continue;
            }
            
            //优先判断v是否能接到其它子序列后面,如果不行,再判断是否能够接到其它序列后面
            if(need.count(v) && need[v] > 0){
                //若可以
                freq[v]--;
                need[v]--;
                
                need[v+1]++;
            }
            else if(freq[v] > 0 && freq[v + 1] > 0 && freq[v + 2] > 0){
                freq[v]--;
                freq[v + 1]--;
                freq[v + 2]--;
                
                need[v + 3]++;
            }
            else
                return false;
        }
        
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值