获取热门电影算法

功能#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.xdnf.cn/news/143192.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

postman访问新建项目报404

"status": 404 查看项目&#xff0c;发现启动类和代码执行部分没有在同一个包下&#xff0c;导致controller的访问没有注册到启动类下&#xff1b;

定义现代化实时数据仓库,SelectDB 全新产品形态全面发布

导读&#xff1a;9 月 25 日&#xff0c;2023 飞轮科技产品发布会在线上正式召开&#xff0c;本次产品发布会以 “新内核、新图景” 为主题&#xff0c;飞轮科技 CEO 马如悦全面解析了现代化数据仓库的演进趋势&#xff0c;宣布立足于多云之上的 SelectDB Cloud 云服务全面开放…

【设计模式】五、原型模式

文章目录 概述示例传统的方式的优缺点原型模式原理结构图-uml 类图 原型模式解决克隆羊问题的应用实例Sheep类实现clone()运行原型模式在 Spring 框架中源码分析 深入讨论-浅拷贝和深拷贝浅拷贝的介绍 小结 概述 示例 克隆羊问题 现在有一只羊 tom&#xff0c;姓名为: tom, 年…

【轮趣-科大讯飞】M260C 环形六麦测试 1 - 产品介绍与配置

原文发布在飞书上&#xff0c;想要的伙伴请联系我&#xff0c;懒得把飞书链接放这了

二十二、MySQL联合查询

1、基础概念 &#xff08;1&#xff09;语法&#xff1a; select …… from …… union [all] select …… from …… &#xff08;2&#xff09;理解&#xff1a; 所谓的联合查询&#xff0c;就是对多个条件查询结果进行联合处理&#xff0c;取其并集。 2、实际操作 &…

K8S:pod集群调度及相关操作

文章目录 一.pod集群调度概念1.调度约束( List-Watch组件)2.List-Watch的工作机制&#xff08;1&#xff09;List-Watch的工作机制流程&#xff08;2&#xff09;List-Watch的工作机制图示 3.调度的过程&#xff08;1&#xff09;调度的任务&#xff08;2&#xff09;调度选择p…

Java 设计模式——抽象工厂模式

目录 1.概念2.结构3.实现4.优缺点5.使用场景6.模式扩展7.JDK源码解析——Collection.iterator方法 1.概念 &#xff08;1&#xff09;Java 设计模式——工厂方法模式 中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机等。这些工厂只生产同种类产品…

sqlmap tamper脚本编写

文章目录 tamper脚本是什么&#xff1f;指定tamper脚本运行sqlmap安全狗绕过tamper脚本 tamper脚本是什么&#xff1f; SQLMap 是一款SQL注入神器&#xff0c;可以通过tamper 对注入payload 进行编码和变形&#xff0c;以达到绕过某些限制的目的。但是有些时候&#xff0c;SQLM…

Qt创建线程(使用moveToThread方法创建子线程)

1.moveTothread方法: &#xff08;1&#xff09;要使用moveToThread方法必须继承与QObject类 &#xff08;2&#xff09;创建任务对象时不能指定父对象 例子&#xff1a; MyWork* work new MyWork(this); // error MyWork* work new MyWork; // ok &#xff08;3&#…

InputAction的使用

感觉Unity中InputAction的使用&#xff0c;步步都是坑。 需求点介绍 当用户长按0.5s 键盘X或者VR left controller primaryButton (即X键)时&#xff0c;显示下一个图片。 步骤总览 创建InputAction资产将该InputAction资产绑定到某个GameObject上在对应的script中&#xf…

[Linux]多线程编程

[Linux]多线程编程 文章目录 [Linux]多线程编程pthread_create函数pthread_join函数pthread_exit函数pthread_cancel函数pthread_self函数pthread_detach函数理解线程库和线程id Linux操作系统下&#xff0c;并没有真正意义上的线程&#xff0c;而是由进程中的轻量级进程&#…

9、SpringBoot_日志使用

三、日志 1.日志的使用 使用 RestController public class LogController {public static final Logger log LoggerFactory.getLogger(LogController.class);GetMapping("/index")public String index(){log.info("请求info 信息");log.debug("请…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…

JetBrains常用插件

Codota AI Autocomplete Java and JavaScript&#xff1a;自动补全插件 Background Image plus&#xff1a;背景图片设置 rainbow brackets&#xff1a;彩虹括号&#xff0c;便于识别 CodeGlance2&#xff1a; 类似于 Sublime 中的代码缩略图&#xff08;代码小地图&#xff…

抽象轻松java

嗨嗨嗨&#xff01; 没想到吧&#xff0c;出现了抽象轻松第4种语言系列&#xff08;我也没想到&#xff09; 简单的java程序&#xff0c;看完就懂的简单逻辑——购物车系统 购物车&#xff0c;首先要有商品吧&#xff0c;现实中的商品有什么属性&#xff1f; 名字&#xff0…

Oracle 12c自动化管理特性的新进展:自动备份、自动恢复和自动维护功能的优势|oracle 12c相对oralce 11g的新特性(3)

一、前言: 前面几期讲解了oracle 12c多租户的使用、In-Memory列存储来提高查询性能以及数据库的克隆、全局数据字典和共享数据库资源的使用 今天我们讲讲oracle 12c的另外的一个自动化管理功能新特性:自动备份、自动恢复、自动维护的功能 二、自动备份、自动恢复、自动维护…

IntelliJ IDEA 介绍、安装、配置优化与快捷键大全

一、简介 IDEA全称 IntelliJ IDEA&#xff0c;是Java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能…

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行&#xff1a;模型拷贝&#xff08;per device&#xff09;&#xff0c;数据 split/chunk&#xff08;对batch切分&#xff09; 每个device上都拷贝一份完整模型&#xff0c;每个device分…

Mysql高级语句(视图表 、存储过程、条件语句、循环语句)

Mysql高级语句&#xff08;视图表 、存储过程、条件语句、循环语句&#xff09; 一、 CREATE VIEW&#xff08;视图&#xff09;1.1、 视图表概述1.2、 视图表能否修改&#xff1f;&#xff08;面试题&#xff09;1.3、 基本语法1.3.1、 创建1.3.2、 查看1.3.3 、删除 1.4、 通…

喜报 |海云安斩获鲲鹏应用创新大赛2023广东赛区双料大奖!

近日&#xff0c;由深圳市工业和信息化局、深圳市南山区人民政府、深圳市南山区工业和信息化局指导&#xff0c;华为技术有限公司、深圳市金融攻关基地、广东省信息技术应用创新产业联盟、鲲鹏产业源头创新中心&#xff08;深圳&#xff09;有限公司主办&#xff0c;深圳市软件…