LeetCode 1152. 用户网站访问行为分析

文章目录

1. 题目

为了评估某网站的用户转化率,我们需要对用户的访问行为进行分析,并建立用户行为模型。

日志文件中已经记录了用户名、访问时间 以及 页面路径。

为了方便分析,日志文件中的 N 条记录已经被解析成三个长度相同且长度都为 N 的数组,分别是:用户名 username,访问时间 timestamp 和 页面路径 website。

第 i 条记录意味着用户名是 username[i] 的用户在 timestamp[i] 的时候访问了路径为 website[i] 的页面。

我们需要找到用户访问网站时的 『共性行为路径』,也就是有最多的用户都 至少按某种次序访问过一次 的三个页面路径。需要注意的是,用户 可能不是连续访问 这三个路径的。

『共性行为路径』是一个 长度为 3 的页面路径列表,列表中的路径 不必不同,并且按照访问时间的先后升序排列。

如果有多个满足要求的答案,那么就请返回按字典序排列最小的那个。(页面路径列表 X 按字典序小于 Y 的前提条件是:X[0] < Y[0] 或 X[0] == Y[0] 且 (X[1] < Y[1] 或 X[1] == Y[1] 且 X[2] < Y[2]))

题目保证一个用户会至少访问 3 个路径一致的页面,并且一个用户不会在同一时间访问两个路径不同的页面。

示例:
输入:
username = ["joe","joe","joe","james","james","james","james","mary","mary","mary"], 
timestamp = [1,2,3,4,5,6,7,8,9,10], 
website = ["home","about","career","home","cart","maps","home","home","about","career"]
输出:["home","about","career"]
解释:
由示例输入得到的记录如下:
["joe", 1, "home"]
["joe", 2, "about"]
["joe", 3, "career"]
["james", 4, "home"]
["james", 5, "cart"]
["james", 6, "maps"]
["james", 7, "home"]
["mary", 8, "home"]
["mary", 9, "about"]
["mary", 10, "career"]2 个用户至少访问过一次 ("home", "about", "career")。
有 1 个用户至少访问过一次 ("home", "cart", "maps")。
有 1 个用户至少访问过一次 ("home", "cart", "home")。
有 1 个用户至少访问过一次 ("home", "maps", "home")。
有 1 个用户至少访问过一次 ("cart", "maps", "home")。
 
提示:
3 <= N = username.length = timestamp.length = website.length <= 50
1 <= username[i].length <= 10
0 <= timestamp[i] <= 10^9
1 <= website[i].length <= 10
username[i] 和 website[i] 都只含小写字符

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/analyze-user-website-visit-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class Solution {
	map<vector<string>,unordered_set<string>> count;//网站路径,用户集合
	unordered_map<string, vector<pair<int,string>>> m;//用户名,《用户访问时间,网站》
public:
    vector<string> mostVisitedPattern(vector<string>& username, vector<int>& timestamp, vector<string>& website) {
    	int i, n = username.size();
    	for(i = 0; i < n; i++) 
    	{
    		m[username[i]].push_back({timestamp[i],website[i]});
    	}
    	for(auto it = m.begin(); it != m.end(); ++it)
    	{
    		sort(it->second.begin(), it->second.end(),[&](auto a, auto b){
    			return a.first < b.first;//某用户访问的网站按时间排序
    		});
    	}
    	vector<string> path;
    	for(auto it = m.begin(); it != m.end(); ++it)
    	{
    		dfs(it->second, path, 0, it->first);//回溯生成所有的三元组
    	}
    	int maxcount = 0;
    	vector<vector<string>> result;
    	for(auto it = count.begin(); it != count.end(); ++it)
    	{	//选出人数最多的最大的路径
    		if(it->second.size() > maxcount)//人数多
    		{
    			result.clear();
    			result.push_back(it->first);
    			maxcount = it->second.size();
    		}
    		else if(it->second.size() == maxcount)//人数相等
    			result.push_back(it->first);
    	}
    	sort(result.begin(), result.end());//取字典序最小的
    	return result[0];
    }

    void dfs(vector<pair<int,string>>& web, vector<string>& path, int idx, string username)
    {
    	if(path.size()==3)
    	{
    		count[path].insert(username);
    		return;
    	}
    	for(int i = idx; i < web.size(); ++i)
    	{
    		path.push_back(web[i].second);
    		dfs(web, path, i+1, username);
    		path.pop_back();
    	}
    }
};

164 ms 19.8 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/107784313