zoukankan      html  css  js  c++  java
  • 求圈子用户数,竟然超过时间限制(TLE)了_2

    接上。

    //以电影直接或间接关注A的所有用户,A是user,即关注A的
    void followedUsers(unsigned int user_id, unsigned int hobby_id)
    {
        unsigned int tempSize = 0;
        vector<FollowRelation>::iterator iterRela = followRelationVec.begin();
        for(;iterRela != followRelationVec.end(); iterRela++)
        {
            if(iterRela->userId == user_id && iterRela->hobbyId == hobby_id)
            {
                followedSet.insert(iterRela->followerId);
            }
        }
    
        if(followedSet.empty())
        {
            return;
        }
    
        while(true)
        {
            tempSize = followedSet.size();
            set<unsigned int>::iterator iterFollowed = followedSet.begin();
            for(;iterFollowed != followedSet.end(); iterFollowed++)
            {
                vector<FollowRelation>::iterator iterRela2 = followRelationVec.begin();
                for(;iterRela2 != followRelationVec.end(); iterRela2++)
                {
                    if(iterRela2->userId == *iterFollowed && iterRela2->hobbyId == hobby_id)
                    {
                        followedSet.insert(iterRela2->followerId);
                    }
                }
            }
    
            if(tempSize == followedSet.size())
            {
                return;
            }
        }
    }
    
    /* 计算指定(用户,爱好)的圈子的用户数量*/
    unsigned int CalcUserNum(unsigned int user_id, unsigned int hobby_id)
    {
        //判断指定的用户是否有指定的爱好
        if(isExistCheck(user_id,hobby_id) == -1)
        {
            return 0;
        }
    
        //每次计算之前清空set
        if(!followingSet.empty())
        {
            followingSet.clear();
        }
    
        if(!followedSet.empty())
        {
            followedSet.clear();
        }
        
        if(!circleSet.empty())
        {
            circleSet.clear();
        }
        
    
        //计算指定(用户,爱好)的圈子的用户数量
        followingUsers(user_id, hobby_id);
        followedUsers(user_id, hobby_id);
    
        //构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。
        std::set_union(followingSet.begin(), followingSet.end(), followedSet.begin(), followedSet.end(), 
                       insert_iterator<set<unsigned int> >(circleSet,circleSet.begin()));
        
        circleSet.insert(user_id);//圈子数包括自身
        return circleSet.size();
    }
    
    /* 清空所有数据*/
    void Clear(void)
    {
        if(!followRelationVec.empty())
        {
            followRelationVec.clear();
        }    
    
        if(!userHobbysMap.empty())
        {
            userHobbysMap.clear();
        }
    
        if(!followingSet.empty())
        {
            followingSet.clear();
        }
    
        if(!followedSet.empty())
        {
            followedSet.clear();
        }
        
        if(!circleSet.empty())
        {
            circleSet.clear();
        }
        
        return;
    }

    void CExampleTest::TestCase01()
    {
    unsigned int hobby_id[1] = {2};

    AddUser(11, 1, hobby_id);
    AddUser(12, 1, hobby_id);
    AddUser(13, 1, hobby_id);

    CPPUNIT_ASSERT(0 == AddFollowInfo(12, 11, hobby_id[0]));
    CPPUNIT_ASSERT(0 == AddFollowInfo(12, 13, hobby_id[0]));
    CPPUNIT_ASSERT(2 == CalcUserNum(11, hobby_id[0]));

    CPPUNIT_ASSERT(0 == AddFollowInfo(11, 12, hobby_id[0]));
    CPPUNIT_ASSERT(0 == AddFollowInfo(11, 13, hobby_id[0]));
    CPPUNIT_ASSERT(3 == CalcUserNum(11, hobby_id[0]));

    return;
    }

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/liuzc/p/6544733.html
Copyright © 2011-2022 走看看