【Leetcode】1152. Analyze User Website Visit Pattern
题目地址:
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相关推荐
- 【Leetcode】100. 相同的树
题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...
- 【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 ...
- 【leetcode】486. Predict the Winner
题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...
- 【leetcode】132. Palindrome Partitioning II
题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...
- 【leetcode】86. Partition List
题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...
- 【Leetcode】103. 二叉树的锯齿形层次遍历
题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...
- 【Leetcode】79.单词搜索
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- 【leetcode】 算法题1 两数之和
[leetcode] 算法题1 两数之和 问题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...
- 【Leetcode】62. 不同路径
题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为&qu ...
最新文章
- MySQL02-升级
- WordPress 网站开发“微信小程序“实战(二)
- linux安装PHP环境
- IE 市场份额暴跌,Edge 能否守住微软的辉煌
- Python 科学计算库 Numpy (二) —— 索引及切片
- Bean的依赖注入的数据类型
- python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
- hive拉链表实现方案一
- STM32F10x 学习笔记4(CRC计算单元 续)
- 多线程(二)--同步及死锁
- java如何输出完整的图_java实现输入输出图片
- Quartz Job
- tomcat 启动编码设置
- 台式计算机拆机步骤ppt,三相异步电动机拆装的方法和步骤.PPT
- 前端开发工程师面试题
- IDEA 自定义主题
- 图形文件的自由转换:DXF转PLT、DWG转其它格式......
- android局域网中的打印机,Android 浅谈同一局域网下使用WiFi连接打印机
- Hadoop之——重新格式化HDFS的方案
- BZOJ 1127: [POI2008]KUP 最大子矩阵