力扣记录 4.8

50. Pow(x, n)

递归:
终止条件:x0 = 1,n=1
递归主体:x
n = x**(n//2) * x**(n//2) 在N为偶数时;奇数时需要单独拎出来一个x1,使得也能两个一半相乘
分解问题:每个x
n都可以表示为两个x**n的一半

class Solution:def myPow(self, x: float, n: int) -> float:# 递归函数def fast_pow(x,n):if n == 0:return 1half = fast_pow(x, n//2)# 偶数if n % 2 == 0:return half * half# 奇数else:return half * half * x# 区分n的正负if n < 0:x = 1/xn = -n# 正常计算return fast_pow(x,n)

169. 多数元素

要找出数组中出现次数大于 (\lfloor \frac{n}{2} \rfloor)
的元素(即多数元素),而不使用collections模块的Counter函数,一个非常有效的方法是使用
Boyer-Moore投票算法。这个算法的核心思想是在一对一对地消除不同的元素之后,剩下的元素(如果存在)一定是多数元素。

Boyer-Moore投票算法的步骤:

  1. 初始化:选择数组中的第一个元素作为候选多数元素,将其计数设为1。
  2. 遍历:遍历数组中剩余的元素:
    • 如果计数器为0,选择当前元素作为新的候选多数元素,并将计数设为1。
    • 如果当前元素等于候选多数元素,将计数器加1。
    • 否则,将计数器减1。
  3. 结果:由于多数元素的数量超过数组长度的一半,所以经过一对一对的消除,最后剩下的元素(候选多数元素)一定是多数元素。

这个算法之所以有效,是因为每次当计数器变为0时,我们都忽略了之前的所有元素,而这之中多数元素和非多数元素的数量是相等的。因此,剩下的部分仍然保持了多数元素的性质。

示例代码:

def majorityElement(nums):count = 0candidate = Nonefor num in nums:if count == 0:candidate = numcount += (1 if num == candidate else -1)return candidate

说明:

  • 这段代码首先初始化candidateNone,计数器count为0。
  • 然后遍历数组,通过逐个比较元素和当前候选者,以及增减计数器的方式,最终找到多数元素。
  • 由于题目假设数组总是存在多数元素,所以最后candidate一定是多数元素。

Boyer-Moore投票算法的时间复杂度是(O(n)),空间复杂度是(O(1)),非常高效。这个方法不仅适用于找多数元素问题,还可以扩展到其他类似的问题中。

53. 最大子数组和

一种是用辅助数组,走动态规划;另一种是迭代,因为当前最大和取决于上一个的。

class Solution:def maxSubArray(self, nums: List[int]) -> int:  # 辅助数组dp = [0] * len(nums)dp[0] = nums[0]for i in range(1, len(nums)):if dp[i-1] >= 0:dp[i] = dp[i-1] + nums[i]else:dp[i] = nums[i]return max(dp)
class Solution:def maxSubArray(self, nums: List[int]) -> int:  # 辅助数组temp_max = global_max = nums[0]for num in nums[1:]:temp_max = max(num, temp_max+num)global_max = max(global_max, temp_max)return global_max

0932. 漂亮数组

递归和分治算法。
[1]是一个最小的漂亮数组。
需要对其进行转换,等式 A[k] * 2 = A[i] + A[j] 的左侧是一个偶数,右侧的两个元素分别来自两个部分。要想等式恒不成立,一个简单的办法就是让 left 部分的数都是奇数,right 部分的数都是偶数。

所以对左边进行奇数序列映射,右边进行偶数序列映射。

class Solution:def beautifulArray(self, n: int) -> List[int]:# 递归终止:1就是最基本的漂亮数组if n == 1: return [1]# 左边的left = self.beautifulArray((n+1)//2)# 右边的right = self.beautifulArray(n//2)# 奇数序列,偶数序列return [2*x-1 for x in left] + [2*x for x in right]

漂亮数组的问题可以通过分治算法的思想来解决。关键的观察点是,如果A是一个漂亮数组,那么对A中的每个元素乘以一个常数和加上一个常数后,得到的数组B也是一个漂亮数组。这是因为乘法和加法操作不会改变数组中元素的相对大小关系,也不会引入满足2*nums[k] == nums[i] + nums[j]的新的三元组(i, j, k)

基于这个观察,我们可以采用如下策略构造一个漂亮数组:

  1. 开始:从最简单的漂亮数组[1]开始。
  2. 分治:通过将已有的漂亮数组A拆分为两部分——A的所有元素乘以2减1(构成奇数序列),以及A的所有元素乘以2(构成偶数序列)——来构造更大的漂亮数组。这样做的好处是,奇数序列和偶数序列内部各自保持了漂亮数组的性质,同时由于奇数和偶数之间的关系,它们合并后也保持了漂亮数组的性质。
  3. 递归:递归地应用上述操作,直到构造出长度为n的漂亮数组。

241. 为运算表达式设计优先级

解决这个问题的关键在于使用分治策略。对于给定的表达式,我们可以通过递归的方式来解决。基本思路是:对于每个运算符,将表达式分割成两部分,分别计算左半部分和右半部分可能产生的结果,然后根据当前运算符将左右两部分的结果组合起来。

这个方法依赖于观察到的事实:当你在某个运算符处分割表达式时,该运算符左边的表达式和右边的表达式都可以独立计算,并且它们的计算结果可以独立组合。

步骤概述:

  1. 遍历表达式:对于表达式中的每个字符,如果它是一个运算符(+-*),则对该运算符执行以下步骤。
  2. 分割表达式:将表达式在当前运算符处分割为两个部分,左半部分和右半部分。
  3. 递归计算:递归地计算左半部分和右半部分可能产生的所有结果。
  4. 合并结果:根据当前运算符,将左右两部分的结果组合起来。
  5. 处理基本情况:如果表达式中没有运算符(即只有数字),则直接返回该数字作为结果。

示例代码:

    # 如果表达式仅包含数字,则直接返回包含该数字的列表if expression.isdigit():return [int(expression)]res = []# 遍历表达式的每个字符for i, char in enumerate(expression):# 如果当前字符是运算符if char in {'+', '-', '*'}:# 分割表达式,并递归计算左右两部分left = diffWaysToCompute(expression[:i])right = diffWaysToCompute(expression[i+1:])# 根据运算符合并左右两部分的结果for l in left:for r in right:if char == '+':res.append(l + r)elif char == '-':res.append(l - r)elif char == '*':res.append(l * r)return res ```

23. 合并 K 个升序链表

困难题根本不想做

合并K个升序链表的问题可以通过多种方法解决。一种高效的方法是使用最小堆(优先队列),这种方法的时间复杂度是O(N log K),其中N是所有链表中元素的总数,K是链表的数量。使用最小堆可以帮助我们每次都从所有链表的当前头节点中找到最小的那个,然后将它合并到结果链表中。

以下是使用Python中的heapq模块实现的步骤:

  1. 初始化最小堆:首先,将每个链表的第一个元素(如果存在)加入到最小堆中。我们还需要存储节点所在链表的信息,以便于后续操作。

  2. 合并链表:然后,我们从堆中弹出最小元素,将它添加到结果链表的末尾,并将这个元素所在链表的下一个元素(如果存在)加入到堆中。重复这个过程,直到堆为空。

  3. 返回合并后的链表

以下是具体的实现:

# Definition for singly-linked list. class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextimport heapqclass Solution:def mergeKLists(self, lists):# 初始化一个虚拟头节点,方便操作dummy = ListNode(0)current = dummy# 初始化堆heap = []# 将每个链表的头节点加入堆中for i, list_head in enumerate(lists):if list_head:# 堆中存储元素值、所在链表的索引、节点,以确保比较的唯一性和完整性heapq.heappush(heap, (list_head.val, i, list_head))# 当堆不为空时,进行合并操作while heap:# 弹出堆中最小元素val, i, node = heapq.heappop(heap)# 将最小元素所在节点添加到结果链表current.next = nodecurrent = current.next# 如果最小元素所在链表还有下一个节点,则将下一个节点加入堆中if node.next:heapq.heappush(heap, (node.next.val, i, node.next))return dummy.next ```

这种方法通过最小堆保证了每次都能从K个链表的当前头节点中选出最小的那个,从而高效地合并了链表。由于Python的heapq库默认是最小堆,我们可以直接利用它来实现这一过程。

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

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

相关文章

如何使用校园网——Win10笔记本,台式机互开热点

当我们使用校园网的时候&#xff0c;往往只能连接一个电脑端&#xff0c;但是又想两个机子同时连接WIFI怎么办呢&#xff1f; 当然&#xff0c;前提条件是你先得其中一台电脑有网络哈 1、打开想开共享热点的电脑的设置 A、点击WIN&#xff0c;再点击设置 2、点击网络和Inte…

JavaScript - 请你说一说对随机数的理解

难度级别:初级及以上 提问概率:40% 在前端开发中,随机数的应用场景非常多,而且也是一个常见的考点。例如网页登录的验证码,看似只有4个随机数字加字母的组合,其实这也是随机数的范畴;例如在抽奖算法中,可以用随机数确定用户中奖的概率…

TCP 三次握手与四次挥手面试题(计算机网络)

TCP 基本认识 TCP 头格式有哪些&#xff1f; 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&a…

Element Plus 表单校验

原理 为 rules 属性传入约定的验证规则&#xff0c;并将 form-Item 的 prop 属性设置为需要验证的特殊键值:model和:rules中字段的名称需要一致 示例&#xff1a; <template><el-form ref"ruleFormRef" :model"ruleForm" :rules"rules&q…

Spring Security——13,认证成功失败注销成功处理器

认证成功&&失败&&注销成功处理器 说明&#xff1a;一、认证成功处理器1.1 自定义成功处理器1.2 配置自定义成功处理器 二、认证失败处理器2.1 自定义失败处理器2.2 配置自定义失败处理器 三、登出成功处理器3.1 自定义登出处理器3.2 配置登出处理器 四、完结撒…

Excel全套213集教程

Excel全套213集教程 包含技术入门93集 图表17集 数据透视35集 公式函数68 基础入门 93节 https://www.alipan.com/s/cMxuPstkS1x 提取码: 77dd 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视…

【C语言】if语句选择题

前言 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 前言 关于if语句相关的选择题 题目一&#xff1a; 关于if语句说法正确是&#xff1a;( ) A .if语…

gitlab使用

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

C语言中的pow()和floor()

C语言中的pow()函数用于计算一个数的指数幂。 首先&#xff0c;要使用pow()函数&#xff0c;需要包含头文件<math.h>。这是因为pow()函数是在数学库中定义的&#xff0c;所以需要通过包含相应的头文件来访问它。 其次&#xff0c;pow()函数的原型是double pow(double x…

windows下使用ZLMediaKit-API+FFmpeg+opengl拉取解码播放流媒体

ZLMediaKit简介 ZLMediaKit是一个基于C11的高性能运营级流媒体服务框架&#xff0c;和SRS类似&#xff0c;功能强大&#xff0c;性能优异&#xff0c;提供多种支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/…

基于Springboot考研资讯平台的设计与实现(论文+源码)_kaic

摘 要 随着现在网络的快速发展&#xff0c;网络的应用在各行各业当中它很快融入到了许多学校的眼球之中&#xff0c;他们利用网络来做这个电商的服务&#xff0c;随之就产生了“考研资讯平台”&#xff0c;这样就让学生考研资讯平台更加方便简单。 对于本考研资讯平台的设计来…

Python爬虫技术快速入门

一、简介 Python爬虫是一种自动化提取互联网上数据的技术&#xff0c;它可以访问网页、解析HTML内容&#xff0c;并从中提取有用的信息。本文将介绍如何使用Python编写简单而有效的爬虫程序。 二、准备工作 在编写Python爬虫之前&#xff0c;我们需要安装一些必要的库。以下…

计算机网络 网络命令的使用

一、实验内容 1.PING网络命令的实验 ping 127.0.0.1(内部回环测试)ping 本主机的IP地址ping 默认网关地址ping远端目的地的IP地址ping localhostping域名 2.其他网络命令实验 命令用途ipconfig/all 显示当前系统网络配置&#xff0c;包括IP地址、子网掩码、默认网关等trace…

Ubuntu 22.04进行远程桌面连接

文心一言 Ubuntu 22.04进行远程桌面连接&#xff0c;无论是连接到Windows 10还是另一个Ubuntu 22.04&#xff0c;都可以通过不同的方式实现。以下是具体的步骤&#xff1a; 连接到Windows 10 在Windows 10上开启远程桌面功能&#xff1a;首先&#xff0c;需要在Windows 10上…

Java设计模式之创建型模式(二)原型模式

原型模式 1、原型模式1-1、应用场景1-2、举个 软栗子1-3、举个 硬栗子1-3、举个实务栗子 学习原型模式的目的&#xff1a;原型模式的目的在于通过复制现有的实例来创建新的对象&#xff0c;以避免通过构造函数创建对象时可能带来的性能开销&#xff0c;同时可以控制对象的深度复…

Ubuntu中变更文件夹的操作权限(chmod使用)

sudo chmod 777 /opt/software/ 777表示所有人都可以修改&#xff0c;读写等操。 sudo chmod 750 /opt/software/ 为了安全起见&#xff0c;上传完毕修改文件夹权限为750,即只有文件夹创建人可以操作 chmod参数说明 第一个数字表示文件所有者的权限 第二个数字表示文件所有…

LangChain - PromptTemplate

文章目录 关于 Prompt关于 PromptTemplate基本创建无变量输入1个变量多变量使用 from_template 自动推断 input_variables 聊天模板使用 from_template 方法构建使用 PromptTemplate 构建 MessagePromptTemplate使用一或多个 MessagePromptTemplates 构建一个 ChatPromptTempla…

pikachu 靶场通关(全)

一.暴力破解 1.1基于表单的暴力破解 1.1.1 漏洞利用 burp抓包&#xff0c;ctrli 添加爆破 根据返回长度得到两个用户 admin 123456 test abc123 1.1.2 源代码分析 文件路径在&#xff1a;vul/burteforce/bf_form.php 通过注释以及说明了&#xff0c;没有验证码也没有其他的…

学习java第三十七天

Spring的优势 1.方便解耦&#xff0c;简化开发&#xff1a;通过spring的ioc容器&#xff0c;将对象间的依赖关系交由Spring进⾏控制&#xff0c;避免硬编码所造成的 过度程序耦合&#xff0c;⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码&#xff0c;可…

上海计算机学会 2024年3月月赛 丙组T4 交易记录(map)

第四题&#xff1a;T4交易记录 标签&#xff1a; m a p map map题意&#xff1a;给定 n n n条股票买入卖出操作&#xff0c;有对应的交易单价 a i a_i ai​和交易数量 b i b_i bi​&#xff0c;分别将多笔买入卖出交易价格相同的进行交易数量合并。买入记录按照交易价格从低到…