题解 | #牛群的特殊分组# 队列

牛群的特殊分组

https://www.nowcoder.com/practice/ba62e31d82a04c9f8d0b0591ab8f2f06

#include <vector>
#include <queue>
#include <algorithm>

//自定义的一个类,里面有绑定同步的两个队列,<int>的队列记录对应<vector<int>>中最末尾的元素下标
class doubleQue
{
    queue<int> q_tail_tag;
    queue<vector<int>> q_value;
public:
    void push(int tailTag, vector<int>value) //push绑定
    {
        q_tail_tag.push(tailTag);
        q_value.push(value);
    }
    int getTailFront() // 获取下标队列头
    {
        return q_tail_tag.front();
    }
    vector<int> getValueFront() // 获取值队列头
    {
        return q_value.front();
    }
    void pop() //pop绑定
    {
        q_tail_tag.pop();
        q_value.pop();
    }
    bool isEmpty() //empty绑定
    {   
        return q_tail_tag.empty();
    }
};

class Solution 
{
    //查找集合 
    void findSet(vector<int> nums, set<vector<int>>& resSet)
    {
        if(nums.size() == 0 ) return;
        doubleQue que;
        
        for(int i=0; i<nums.size();i++)
        {
            vector<int>t;
            t.push_back(nums[i]);
            que.push(i,t);
        }

        while(!que.isEmpty())
        {
            int tail = que.getTailFront();
            vector<int> t = que.getValueFront();
            resSet.emplace(t);
           
            que.pop(); // 首节点出队 -- 循环遍历后面的元素拼接至其尾部 并加入队列(一轮遍历一次剩余元素,每次只添加一个元素)
            for(int i=tail+1; i<nums.size();i++)
            {
                vector<int> st = t;
                st.push_back(nums[i]);
                que.push(i,st);
            }
        }
    }

public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > special_groups(vector<int>& nums) 
    {
        set<vector<int>> resSet;
        sort(nums.begin(),nums.end());//先排序
        
        findSet(nums,resSet);
        vector<vector<int>> resVec(resSet.begin(),resSet.end());
        return resVec;
    }
};

有两个队列,一个队列负责存储数组信息,另一个存储这个数组最末尾元素在nums中的下标,两个队列绑定行动

初始化时将单个元素全部加入队列,每次弹出时,弹出的数组就是一个组合,将组合添加至set,然后将这个组合再添加一轮数后添加入队列中

大致流程如下:

1.初始化队列

2. 处理

全部评论

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好另外宣传下自己的开源仿b站微服务项目,GitHub已经410star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务