1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { private static class Pair { int time; String web;
Pair(int _time, String _web) { time = _time; web = _web; } }
public List<String> mostVisitedPattern(String[] username, int[] timestamp, String[] website) { Map<String, List<Pair>> userPair = new HashMap<>(); for (int i = 0; i < username.length; i++) { userPair.putIfAbsent(username[i], new ArrayList<>()); userPair.get(username[i]).add(new Pair(timestamp[i], website[i])); } String res = ""; Map<String, Integer> patternCount = new HashMap<>(); for (String user : userPair.keySet()) { List<Pair> pairList = userPair.get(user); Collections.sort(pairList, (a, b) -> a.time - b.time); Set<String> patterns = new HashSet<>(); for (int i = 0; i < pairList.size(); i++) { for (int j = i + 1; j < pairList.size(); j++) { for (int k = j + 1; k < pairList.size(); k++) { StringBuilder currPattern = new StringBuilder(); currPattern.append(pairList.get(i).web) .append(" ") .append(pairList.get(j).web) .append(" ") .append(pairList.get(k).web); String currPatternString = currPattern.toString(); if (patterns.add(currPatternString)) { patternCount.put(currPatternString, patternCount.getOrDefault(currPatternString, 0) + 1); if (res.equals("") || patternCount.get(res) < patternCount.get(currPatternString) || (patternCount.get(res) == patternCount.get(currPatternString) && res.compareTo(currPatternString) > 0)) { res = currPatternString; } } } } } } return Arrays.asList(res.split(" ")); } }
|
这道题比较坑的就是这个题目描述很迷. 它想表达的意思是, 一个用户按照时间线会visit一些网站. 所有网站构成的非重复combinations(按照时间线不能调换位置)构成一个pattern. 比如[www, aaaa, bbbb, www, aaaa, bbbb]. 那么就能有[www, aaaa, bbbb], [www, aaaa, www]等等. 我们注意到[www, aaaa,
bbbb]这个pattern出现了很多次, 但是我们一个用户只记一次.
然后就是三层for循环遍历所有的combinations.
时间复杂度感觉就是O(n^3)
空间复杂度: O(n^3) n是给定的array的长度. 因为那个存pattern count的会到n^3. 假如给的只有一个用户, 它visit的所有websites都不同. 那组合方式就是Cn3, 也就是n三次方了.