上次坚持刷leetcode,还是两年前leetcode刚出中文版前后,贡献了部分题目的翻译。偷懒好久了,再次打开,发现题目多了好多,随便刷一道:

一、题目

两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。

输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 {id1},{id2}: {similarity},其中 id1 为两个文档中较小的 id,similarity 为相似度,精确到小数点后 4 位。以任意顺序返回数组均可。

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

二、题目分析

NLP的最基本算法,虽然简化很多,但非常重要。

看到稀疏,脑海里首先闪出了字典,毕竟查找、修改操作时间复杂度O(1),还能节省内存,依次遍历docs中的每个doc,以内容为键值,以字符串连接方式添加对应文档序号(这个估计是运算速度慢的原因,不过实在懒得在这个地方优化了)。将获得文档集存在的每个字符,以及对应的文档。每个字典值中的文档序号全组合,获得文档对字符,统计字符对数量,即为交集元素数,两个文档长度之和减交集元素数即为并集元素数。

三、代码实现

import numpy as np
class Solution:def computeSimilarities(self, docs: List[List[int]]) -> List[str]:def helper(i, v):char_dict[v] = '{},{}'.format(char_dict.get(v, ''), i)return 1def helper2(v):def helper(k):similar_dict[k] = similar_dict.get(k, 0) + 1return 1[helper(k) for k in ['{},{}'.format(*sorted([int(i) for i in x])) for x in combinations(v[1: ].split(','), 2)]]return 1def helper3(k, v):inter_counts = similar_dict.get(k)union_counts = sum([len(docs[int(index)]) for index in k.split(',')]) - inter_countssim_rate = inter_counts / union_countsreturn '{}: {:.4f}'.format(k, sim_rate + 1e-9)char_dict = {}similar_dict = {}[helper(i, c) for i, l in enumerate(docs) for c in l] [helper2(v) for v in char_dict.values()]res = [helper3(k, v) for k, v in similar_dict.items()]return res

四、出现问题

提交代码后,报解答错误,分析结果:

                my              p
120  74,90: 0.0312  74,90: 0.0313

132多组结果,一行预期结果与输出不一致,仔细观察,该死的浮点数,遇5进位出现的问题,尝试了np库的round方法,无效,结果还是这样。再次尝试在计算出的相似度结果+1e-9,通过。结果如下:

偷懒好久,再刷leetcode——稀疏相似度相关推荐

  1. 吴忠强:刷LeetCode的正确姿势!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:吴忠强,东北大学,Datawhale成员 写在前面 最近面试中做算 ...

  2. 【算法】吴忠强:刷LeetCode的正确姿势!

    作者:吴忠强,东北大学,Datawhale成员 写在前面 最近面试中做算法题,受了打击,和我之前准备的很不一样.这篇文章通过笔试实战经验复盘我在刷LeetCode的一些误区和今后对策,供大家参考备战秋 ...

  3. 如何快速高效的刷Leetcode

    前言 随着互联网寒潮的到来, 越来越多的互联网公司提高了面试的难度,其中之一就是加大了面试当中手撕算法题的比例.这里说的算法题不是深度学习,机器学习这类的算法,而是排序,广度优先,动态规划这类既考核数 ...

  4. 一起刷 leetcode 之旋转矩阵(头条/华为/陌陌真题)

    微信公众号:[每天晒白牙] 关注可了解更多的编程知识.问题或建议,请公众号留言; 如果你觉文章对你有帮助,欢迎关注与 题目描述 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节. ...

  5. 手把手带你刷Leetcode力扣 学习总结

    文章目录 1. 总体规划 2. 算法复杂度 2.1 时间复杂度 2.2 空间复杂度 3. 数据结构 3.1 数组[Array] 3.1.1 Python常用操作 3.1.2 Java常用操作 3.1. ...

  6. leetcode怎么用时间刷_大家都是如何刷 LeetCode 的?

    2020年4月更新: 跳槽告一段落,开启新的旅程.不用再爆肝刷题了,但还会做周赛保持手感. TL, DR 太长不看零基础先去学一点"数据结构","算法设计与分析" ...

  7. 刷leetcode是什么样的体验?【转】

    转自:https://www.zhihu.com/question/32322023 刷leetcode是什么样的体验? https://leetcode.com/ 1 条评论 默认排序 按时间排序 ...

  8. 惊了,AI已经学会刷LeetCode了!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你在面试 ...

  9. 在IDE中刷LeetCode,编码调试一体化,刷题效率直线up!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还在为刷 ...

最新文章

  1. freemarker写select组件报错总结(六)
  2. 编译安装Zabbix 2.2 (LNMP环境)
  3. 数塔问题和最长上升子序列问题
  4. restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体
  5. python pil_python PIL 图像处理
  6. ISTQB高级国际认证试题及答案(一)
  7. vue从入门到开发--4--处理http请求
  8. 算法学习笔记(八) 动态规划的一般求解方法
  9. Spark源码阅读@ListenerBus 的实现
  10. 基于Android的海康威视的二次开发
  11. 神秘的java Https
  12. Recyclerview 特别好用的局部刷新item方法
  13. 为什么要进行实名认证?如何实名认证?
  14. Java整型变量和整型常量
  15. Pluecker coordinates普吕克坐标系介绍
  16. 2021-06-03 【论文笔记】Cross-domain Correspondence Learning for Exemplar-based Image Translation
  17. 简单的营销策略重复做,发挥到极致就是一心一意的去做
  18. 使用matla求取一维线性函数的系数
  19. 所有的非处女啊!到你忏悔的时候了
  20. 网站安全监控的意义何在?

热门文章

  1. IOS-datepick
  2. linux循环目录下目录,Shell循环列出目录下所有文件或查找目录下包含指定字符串的文件...
  3. (springboot-vue) 前后端交互实现
  4. Jetson nano查看自带的opencv版本
  5. c语言 日期 星期几,新手做的日历表及查找日期是星期几
  6. 百度9亿拿下春晚,今日头条掷10亿红包雨...狂欢背后,互联网圈的品牌“混战”...
  7. 关键字extern用法
  8. 安卓手机的IPSec /PPTP/L2TP连接
  9. 【Qt炫酷动画】0.Qt动画类简介
  10. 04.C语言的文件存储