获取热门电影算法

功能#2:获取热门电影

为我们的“Netflix”项目实现“获取热门电影”功能。

我们将介绍以下内容

描述

解决方案
复杂性措施
时间复杂度
空间复杂度
描述#
现在,我们需要建立一个标准,以便将来自多个国家的顶级电影组合成一个单一的顶级电影列表。为了扩展,内容搜索以分布式方式执行。每个国家/地区的搜索结果在单独的列表中生成。给定列表的每个成员都按受欢迎程度排名,1最受欢迎和受欢迎程度随着排名数字的增加而下降。

假设以下标题由提供的 ID 表示:
在这里插入图片描述

电影映射到他们的行列
我们将得到n 个列表,这些列表都按受欢迎程度的升序排列。我们必须将这些列表组合成一个列表,该列表将按升序排序,即从最好到最差。

请记住,排名对于个别电影是唯一的,一个排名可以在多个列表中。

让我们通过一个插图更好地理解这一点:
在这里插入图片描述

将多个评级列表合并为一个

解决方案#

由于我们的任务涉及多个列表,因此您应该将问题分解为多个任务,从一次合并两个列表的问题开始。然后,您应该将前两个列表的结果与第三个列表相结合,依此类推,直到达到最后一个。

让我们讨论一下我们将如何实现这个过程:

  1. 将第一个列表视为结果,并将其存储在一个变量中。

  2. 遍历列表的列表,从第二个列表开始,并将其与我们存储的列表组合为结果。结果应该存储在同一个变量中。

  3. 当组合两个列表时,比如l1和l2,维护一个prev指向虚拟节点的指针。

  4. 如果 list 的值l1小于或等于 list 的值l2,则将前一个节点连接到l1并递增l1。否则,对 list 执行相同的操作l2。

  5. 继续重复上述步骤,直到一个列表指向一个nil值。

  6. 将非零列表连接到合并后的列表并返回。

让我们看看下面解决方案的代码:

package mainfunc merge2SortedLists(l1, l2 *LinkedListNode) *LinkedListNode {dummy := &LinkedListNode{data: -1}prev := dummyfor l1 != nil && l2 != nil {if l1.data <= l2.data {prev.next = l1l1 = l1.next} else {prev.next = l2l2 = l2.next}prev = prev.next}if l1 == nil {prev.next = l2} else {prev.next = l1}return dummy.next
}func mergeKSortedLists(lists []*LinkedListNode) *LinkedListNode {if len(lists) > 0 {res := lists[0]for i := 1; i < len(lists); i++ {res = merge2SortedLists(res, lists[i])}return res}return &LinkedListNode{data: -1}
}func main() {a := createLinkedList([]int{11, 41, 51})b := createLinkedList([]int{21,23,42})c := createLinkedList([]int{25,56,66,72})list1 := []*LinkedListNode{a, b, c}display(mergeKSortedLists(list1))
}
package mainimport ("fmt""math/rand"
)type LinkedListNode struct {key              intdata             intnext             *LinkedListNodearbitrartPointer *LinkedListNode
}func createLinkedList(lst []int) *LinkedListNode {var head *LinkedListNodevar tail *LinkedListNodefor _, x := range lst {newNode := &LinkedListNode{data: x}if head == nil {head = newNode} else {tail.next = newNode}tail = newNode}return head
}func insertAtHead(head *LinkedListNode, data int) *LinkedListNode {newNode := &LinkedListNode{data: data}newNode.next = headreturn newNode
}func insertAtTail(head *LinkedListNode, data int) *LinkedListNode {newNode := &LinkedListNode{data: data}if head == nil {return newNode}temp := headfor temp.next != nil {temp = temp.next}temp.next = newNodereturn head
}func createRandomList(length int) *LinkedListNode {var listHead *LinkedListNodefor i := 0; i < length; i++ {listHead = insertAtHead(listHead, rand.Intn(100))}return listHead
}func toList(head *LinkedListNode) []int {var lst []inttemp := headfor temp != nil {lst = append(lst, temp.data)temp = temp.next}return lst
}func display(head *LinkedListNode) {temp := headfor temp != nil {fmt.Printf("%d", temp.data)temp = temp.nextif temp != nil {fmt.Printf(", ")}}fmt.Printf("\n")
}func mergeAlternating(list1, list2 *LinkedListNode) *LinkedListNode {if list1 == nil {return list2}if list2 == nil {return list1}head := list1for list1.next != nil && list2 != nil {temp := list2list2 = list2.nexttemp.next = list1.nextlist1.next = templist1 = temp.next}if list1.next == nil {list1.next = list2}return head
}func isEqual(list1, list2 *LinkedListNode) bool {if list1 == list2 {return true}for list1 != nil && list2 != nil {if list1.data != list2.data {return false}list1 = list1.nextlist2 = list2.next}return (list1 == list2)
}

复杂性措施#

时间复杂度	空间复杂度
O(k \times n)O ( k × n )	O(1)○ ( 1 )

时间复杂度#

时间复杂度为 O(k \times n)O ( k × n ),其中k是列表的数量,n是单个列表的最大长度。

空间复杂度#

O(1)○ ( 1 ),因为使用了恒定的空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24. 图论 - 图的表示种类

Hi,你好。我是茶桁。 之前的一节课中,我们了解了图的来由和构成,简单的理解了一下图的一些相关概念。那么这节课,我们要了解一下图的表示,种类。相应的,我们中间需要穿插一些新的知识点用于更好的去理解图,比如说邻接矩阵。 图的表示 我们一般用什么样的形式来表示图…

Linux su sudo命令

1、su命令——切换用户 1.1、切换到root用户(需要密码) su - root 1.2、切换到其他用户&#xff0c;比如jackma&#xff08;无需密码&#xff09; su - jackma 2、sudo命令——给普通用户添加root权限 2.1、用法 切换到root用户&#xff0c;执行visudo命令&#xff0c;会自动…

配置pytorchGPU虚拟环境-python3.7

cuda版本的pytorch包下载地址戳这里 winR->输入cmd->输nvcc -V回车 cuda 11.0 输入以下命令来查找 CUDA 的安装路径&#xff1a; Windows: where nvcc 输入以下命令来查找 cuDNN 的版本号&#xff1a; Windows: where cudnn* cuDNN 8.0 本机安装的是cuda 11.0&…

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…

第二证券:迎政策助力,新型工业化爆发,德恩精工3日涨超60%

新式工业化概念26日盘中大幅拉升&#xff0c;到发稿&#xff0c;德恩精工、精伦电子、天永智能等涨停&#xff0c;固高科技涨约8%&#xff0c;亚威股份涨逾6%&#xff0c;金自天正、创世纪涨约5%。 值得注意的是&#xff0c;精伦电子已接连5个交易日涨停&#xff0c;公司昨日晚…

2023-09-21 buildroot linux 查看应用的log打印信息,命令cat /var/log/messages

一、应用会调用syslog 把打印信息输出到串口&#xff0c;debug 串口会打印kernel的log和上层应用的的log。 二、linux 命令cat /var/log/messages查看应用log

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库&#xff0c;用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式&#xff0c;并提供从图像中​​读取多个字符和字体、粗体和斜体样式…

如何给Nginx配置访问IP白名单

一、Nginx配置访问IP白名单 有时部署的应用需要只允许某些特定的IP能够访问&#xff0c;其他IP不允许访问&#xff0c;这时&#xff0c;就要设置访问白名单&#xff1b; 设置访问白名单有多种方式&#xff1a; 1.通过网络防火墙配置&#xff0c;例如阿里云/华为云管理平台 2.…

Selenium自动化测试 —— 通过cookie绕过验证码的操作!

验证码的处理 对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 解决验证码的方法如下&#xff1a; 1、开发做个万能…

ChatGPT 现在可以看、听和说话了!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

玩转Mysql系列 - 第23篇:mysql索引管理详解

这是Mysql系列第23篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 关于索引的&#xff0c;可以先看一下前2篇文章&#xff1a; 什么是索引&#xff1f; mysql索引原理详解 本文主要介…

Apache shiro RegExPatternMatcher 权限绕过漏洞 (CVE-2022-32532)

漏洞描述 2022年6月29日&#xff0c;Apache 官方披露 Apache Shiro &#xff08;CVE-2022-32532&#xff09;权限绕过漏洞。 当Apache Shiro中使用RegexRequestMatcher进行权限配置&#xff0c;且正则表达式中携带"."时&#xff0c;未经授权的远程攻击者可通过构造恶…

【医疗图像处理软件】重要功能集合

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 一起挑战150岁生命线&#xff01; 前言之前&#xff1a;从事医疗器械行业使我们更加关注自己的健康&#xff0c;每天看着髋膝关节置换的手术视频&#xff0c;我们会更加爱护自己的膝盖。同…

服务断路器_服务雪崩解决方案之服务降级

什么是服务降级 两种场景: 当下游的服务因为某种原因响应过慢&#xff0c;下游服务主动停掉一些不太重要的业务&#xff0c;释放出服务器资源&#xff0c;增加响应速度&#xff01;当下游的服务因为某种原因不可用&#xff0c;上游主动调用本地的一些降级逻辑&#xff0c;避免…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码&#xff0c;在执行pre-commit时&#xff0c;出现如下错误&#xff1a; Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性&#xff1a;core.autocrlf 由于…

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…

C++——安装环境、工具

一、进入官网下载 Visual Studio 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 二、安装 三、安装完后如果出现window SDK 下载失败&#xff0c;可自行下载&#xff0c;如果没有请跳过这一步 Window SDK 官方地址&#xff1a;https://developer.microsoft…

详解Java执行groovy脚本的两种方式

详解Java执行groovy脚本的两种方式 文章目录 详解Java执行groovy脚本的两种方式介绍记录Java执行groovy脚本的两种invokeFunction:invokeMethod:以下为案例&#xff1a;引入依赖定义脚本内容并执行运行结果&#xff1a;例如把脚本内容定义为这样&#xff1a;执行结果就是这样了…

Java 大厂八股文面试专题-JVM相关面试题 类加载器

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式-CSDN博客 JVM相关面试题 1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序…