LeetCode 1152. 用户网站访问行为分析
文章目錄
- 1. 題目
- 2. 解題
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阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1152. 用户网站访问行为分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 723. 粉碎糖果(模
- 下一篇: LeetCode 956. 最高的广告牌