题目地址:

https://leetcode.com/problems/analyze-user-website-visit-pattern/

给定三个等长的数组,数组AAA是一系列用户,数组BBB是这些用户访问网站的时间戳,数组CCC是用户访问的网站。某个用户按时间依次访问的网站如果长度lll大于333,就可以取出(l3)l\choose3(3l​)个三元组。问这些三元组里被最多用户访问过的组合是哪个。如果答案有多个则返回字典序最小的那个三元组。题目保证至少有一个用户访问了三个或以上的网站。

先将用户、时间戳和网站做成一个类,然后按照时间戳排序,再用一个哈希表存一下每个用户访问网站的序列。接着对每个用户,枚举三元组,并对三元组计数。注意,同一个三元组对同一个用户而言,只能计数一次。最后查找一下计数次数最多、字典序最小的三元组即可。代码如下:

import java.util.*;public class Solution {class Visit {String username, website;int timestamp;public Visit(String username, String website, int timestamp) {this.username = username;this.website = website;this.timestamp = timestamp;}}public List<String> mostVisitedPattern(String[] username, int[] timestamp, String[] website) {int n = username.length;// 先存一下Visit,然后对其按照时间戳排序List<Visit> list = new ArrayList<>();for (int i = 0; i < n; i++) {list.add(new Visit(username[i], website[i], timestamp[i]));}list.sort((v1, v2) -> Integer.compare(v1.timestamp, v2.timestamp));// 存一下每个用户访问网站的序列Map<String, List<String>> map = new HashMap<>();for (int i = 0; i < n; i++) {Visit visit = list.get(i);map.putIfAbsent(visit.username, new ArrayList<>());map.get(visit.username).add(visit.website);}// 对每个用户枚举三元组Map<List<String>, Integer> count = new HashMap<>();for (Map.Entry<String, List<String>> entry : map.entrySet()) {List<String> webList = entry.getValue();if (webList.size() >= 3) {// 这里对三元组要去重,因为他们的计数只能加1Set<List<String>> set = new HashSet<>();for (int i = 0; i < webList.size() - 2; i++) {for (int j = i + 1; j < webList.size() - 1; j++) {for (int k = j + 1; k < webList.size(); k++) {List<String> tuple = Arrays.asList(webList.get(i), webList.get(j), webList.get(k));set.add(tuple);}}}// 在哈希表里的计数加1for (List<String> tuple : set) {count.put(tuple, count.getOrDefault(tuple, 0) + 1);}}}// 最后找一下出现次数最多、字典序最小的三元组List<String> res = new ArrayList<>();int maxCount = 0;for (Map.Entry<List<String>, Integer> entry : count.entrySet()) {if (entry.getValue() > maxCount) {maxCount = entry.getValue();res = entry.getKey();} else if (entry.getValue() == maxCount && compare(entry.getKey(), res) < 0) {res = entry.getKey();}}return res;}private int compare(List<String> l1, List<String> l2) {for (int i = 0; i < 3; i++) {int comp = l1.get(i).compareTo(l2.get(i));if (comp != 0) {return comp;}}return 0;}
}

时间复杂度O(n3)O(n^3)O(n3),nnn是数组长度,空间O(n)O(n)O(n)。

【Leetcode】1152. Analyze User Website Visit Pattern相关推荐

  1. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  2. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  3. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  4. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  5. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  6. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  7. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  8. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

  9. 【Leetcode】62. 不同路径

    题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为&qu ...

最新文章

  1. MySQL02-升级
  2. WordPress 网站开发“微信小程序“实战(二)
  3. linux安装PHP环境
  4. IE 市场份额暴跌,Edge 能否守住微软的辉煌
  5. Python 科学计算库 Numpy (二) —— 索引及切片
  6. Bean的依赖注入的数据类型
  7. python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  8. hive拉链表实现方案一
  9. STM32F10x 学习笔记4(CRC计算单元 续)
  10. 多线程(二)--同步及死锁
  11. java如何输出完整的图_java实现输入输出图片
  12. Quartz Job
  13. tomcat 启动编码设置
  14. 台式计算机拆机步骤ppt,三相异步电动机拆装的方法和步骤.PPT
  15. 前端开发工程师面试题
  16. IDEA 自定义主题
  17. 图形文件的自由转换:DXF转PLT、DWG转其它格式......
  18. android局域网中的打印机,Android 浅谈同一局域网下使用WiFi连接打印机
  19. Hadoop之——重新格式化HDFS的方案
  20. BZOJ 1127: [POI2008]KUP 最大子矩阵

热门文章

  1. EASYRECOVERY_3.3.29包含注册机、都教授数据恢复含注册码
  2. 软考学院九老师简介:国家软考(中高级认证)培训
  3. Android Studio 微信分享功能(包括可以分享到朋友圈,分享到朋友)
  4. 4大区块链技术高盈利方式盘点
  5. 最好的补丁是严密的安防体系
  6. 血战力扣 332.零钱兑换
  7. 操作系统教程第六版——第三章课后作业
  8. Android Handler讲述很详细的一篇文章
  9. 河南大学计算机考研群2021,河南大学2021年统考生拟录取名单公示
  10. 做中国强制性CCC认证需要多少钱