LeetCode题练习与总结:超级次方--372

一、题目描述

你的任务是计算 a^b 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。

示例 1:

输入:a = 2, b = [3]
输出:8

示例 2:

输入:a = 2, b = [1,0]
输出:1024

示例 3:

输入:a = 1, b = [4,3,3,8,5,2]
输出:1

示例 4:

输入:a = 2147483647, b = [2,0,0]
输出:1198

提示:

  • 1 <= a <= 2^31 - 1
  • 1 <= b.length <= 2000
  • 0 <= b[i] <= 9
  • b 不含前导 0

二、解题思路

  • 首先,我们可以利用模运算的性质:(x * y) % p = [(x % p) * (y % p)] % p。这意味着我们可以将大数幂分解成多个小数幂,然后逐步取模。

  • 对于非常大的正整数 b,我们可以将 b 看作是一个大数的每一位数字。例如,如果 b = [1, 0],则它表示数字 10。我们可以将问题分解为计算 a^10 的模。

  • 我们可以使用递归的方法来解决这个问题。递归的基本思路是:如果 b 是一个一位数,那么我们直接计算 a^b % 1337;如果 b 是多位数,我们可以将其分解为两部分:b 的最后一位数字和 b 去掉最后一位数字的部分。例如,对于 b = [1, 0],我们可以将其分解为 b 的最后一位数字 0 和 b 去掉最后一位数字的部分 [1]。

  • 我们可以使用以下递归公式来计算 a^b % 1337:

    • 如果 b 的长度为 1,返回 a^b[0] % 1337。
    • 否则,返回 (a^b[0] % 1337) * (a^(b 去掉最后一位数字) % 1337) % 1337
  • 注意,由于 b 可能非常大,我们需要在每一步计算中都对结果取模,以避免整数溢出。

三、具体代码

class Solution {public int superPow(int a, int[] b) {if (b == null || b.length == 0) {return 1;}return superPowHelper(a, b, b.length - 1);}private int superPowHelper(int a, int[] b, int index) {if (index < 0) {return 1;}int part1 = myPow(a, b[index]);int part2 = myPow(superPowHelper(a, b, index - 1), 10);return (part1 * part2) % 1337;}private int myPow(int x, int n) {if (n == 0) {return 1;}x %= 1337;int result = 1;while (n > 0) {if ((n & 1) == 1) {result = (result * x) % 1337;}x = (x * x) % 1337;n >>= 1;}return result;}
}

在这段代码中,superPow 是主函数,它调用递归函数 superPowHelper 来计算结果。myPow 函数用于计算 x 的 n 次幂并对 1337 取模。递归函数 superPowHelper 使用递归公式来计算结果。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • myPow 函数的时间复杂度:在 myPow 函数中,我们使用了一个循环,其中循环的次数取决于 n 的二进制表示中的位数。n 的二进制位数是 O(log n)。在每次循环中,我们执行常数时间的操作(乘法和模运算)。因此,myPow 函数的时间复杂度是 O(log n)。

  • superPowHelper 函数的时间复杂度:在 superPowHelper 函数中,我们递归地调用自己,并且每次递归调用都会减少数组 b 的一个元素。由于 b 的长度是固定的,假设为 m,则递归的深度最多是 m。在每次递归调用中,我们都会调用一次 myPow 函数,其时间复杂度是 O(log b[i]),其中 b[i] 是一个小于 10 的整数。因此,对于每次递归调用,myPow 的时间复杂度可以认为是 O(1)。所以,superPowHelper 函数的时间复杂度是 O(m),因为我们需要遍历数组 b 中的每个元素一次。

  • 综合时间复杂度:superPow 函数的时间复杂度与 superPowHelper 相同,因为 superPow 只调用了 superPowHelper 一次。因此,整个算法的时间复杂度是 O(m),其中 m 是数组 b 的长度。

2. 空间复杂度
  • myPow 函数的空间复杂度:myPow 函数使用了一些固定数量的变量(x, n, result),因此它的空间复杂度是 O(1)。

  • superPowHelper 函数的空间复杂度:在递归调用过程中,每次递归调用都会在调用栈上占用一定的空间。由于递归的深度最多是 m,因此调用栈的空间复杂度是 O(m)。

  • 综合空间复杂度:整个算法的空间复杂度主要取决于递归调用的栈空间,因此空间复杂度是 O(m),其中 m 是数组 b 的长度。

五、总结知识点

  1. 递归superPowHelper 函数是一个递归函数,它通过递归调用来解决子问题。递归的基本条件是当 index < 0 时返回 1。

  2. 模运算:在 myPow 函数中,频繁使用了模运算 % 1337,这是为了避免整数溢出,并确保结果在 0 到 1336 之间。

  3. 快速幂算法myPow 函数实现了快速幂算法(也称为指数的二进制方法),用于高效计算 x 的 n 次幂。该算法通过将指数 n 表示为二进制形式,并使用迭代和位操作来减少乘法操作的次数。

  4. 位操作:在 myPow 函数中,使用位操作 (n & 1) 来检查 n 的当前最低位是否为 1,以及使用 n >>= 1 来将 n 右移一位,相当于 n = n / 2

  5. 数组操作:在 superPow 和 superPowHelper 函数中,对数组 b 进行操作,使用数组的长度和索引来访问数组元素。

  6. 边界条件检查:在 superPow 函数开始时,检查输入数组 b 是否为 null 或者长度为 0,这是一种常见的防御性编程实践。

  7. 数学运算:代码中使用了乘法运算来计算幂的乘积,并使用了模运算来保持结果在特定的范围内。

  8. 函数封装:代码将不同功能的逻辑封装在 superPowsuperPowHelper, 和 myPow 三个函数中,每个函数都有明确的职责,体现了良好的编程习惯。

  9. 数学性质:代码利用了模运算的性质 (a * b) % c = [(a % c) * (b % c)] % c,这在计算大数的幂模运算时非常有用。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

rhce作业4

问题&#xff1a; 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 配置&#xff1a; 主服务器配置 安装 关闭防火墙 主配置文件定义正反向解析域 正向解析资源记录文件 反向解析记录文件 重启…

MybatisPlus入门(八)MybatisPlus-DQL编程控制

一、字段映射与表名映射 数据库表和实体类名称一样自动关联&#xff0c;数据库表和实体类有部分情况不一样。 问题一&#xff1a;表名与编码开发设计不同步&#xff0c;表名和实体类名称不一致。 解决办法&#xff1a; 在模型类上方&#xff0c;使用TableName注解&#xf…

摩尔斯电码

偏方记忆法 F .._. 滴滴打滴 很费钱 F 费 R ._. 滴打滴 洗发水广告 滴答滴&#xff0c;滴答滴 大家好才是正的好 G 和Q 可以一起记忆有相通点 把G 也看成一个圈&#xff0c;相交的地方一个点&#xff0c;因为圈没满缺一个_ K 和 Y 可以一起记忆 把K躺着看…

Vue Router进阶详解

导航守卫 若依框架登录鉴权详解&#xff08;动态路由&#xff09;_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发&#xff1a; 当用户点击页面中的链接、使用编程式导航&#xff08;如router.push或router.replace&#xff09;或手动输入URL时&#xff0c;导航流程被触发。…

如何在Linux命令行中使用GhatGPT

2、验明正身&#xff0c;证明我的所在地是国内 3、第一次提问 4、第二次提问 5、问他一首古诗 6、话不多说&#xff0c;现在来展示他的安装过程 7、输入GitHub的网址 https://github.com/aandrew-me/tgpt 8、详情页向下翻 9、到终端输入 下列命令&#xff0c;等待安装&#x…

iOS灵动岛动画小组件怎么播放动画

这个灵动岛相关的展示位置分几个地方&#xff1a; 紧凑型&#xff0c;最小化&#xff0c;扩展型&#xff0c;还有锁屏位置 我们先来看一下我这边实现的动画效果 demo下载&#xff1a; iOS灵动岛GIF动画 灵动岛样式 灵动岛有三种渲染模式&#xff1a; 第一种是 紧凑型&…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…

vscode makfile编译c程序

编译工具安装 为了在 Windows 上安装 GCC&#xff0c;您需要安装 MinGW-w64。 MinGW-w64 是一个开源项目&#xff0c;它为 Windows 系统提供了一个完整的 GCC 工具链&#xff0c;支持编译生成 32 位和 64 位的 Windows 应用程序。 1. 下载MinGW-w64源代码&#xff0c;如图点…

这个操作惊呆我了!海康存储 R1竟然可以这样部署Portainer

这个操作惊呆我了&#xff01;海康存储 R1竟然可以这样部署Portainer 哈喽小伙伴们好&#xff0c;我是Stark-C~ 最近到手了海康存储&#xff08;HIKVISION&#xff09;私有云R1 &#xff0c;该机的卖点还是很多的&#xff0c;比如优秀的做工&#xff0c;强大的配置&#xff0…

雷电模拟器ls内部操作adb官方方法

正常情况下&#xff0c;我们通过adb操作模拟器&#xff0c;如安装软件、运行shell命令等&#xff0c;但是用windows系统&#xff0c;adb就经常掉线&#xff0c;端口被占用&#xff0c;或者发现不到设备&#xff0c;对于调试或者自动化非常痛苦。就在雷电安装目录下&#xff0c;…

TS学习笔记

一、TS运行环境搭建 1、安装 安装命令 npm i -g typescript 第一步&#xff1a;新建index.html和demo.ts 第二步&#xff1a;在index.html引入demo.ts文件 第三步&#xff1a;运行TS的命令 tsc demo.ts 注意&#xff1a;运行命令后&#xff0c;会将ts文件转换成js文件 …

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

机器学习算法之回归算法

一、回归算法思维导图 二、算法概念、原理、应用场景和实例代码 1、线性回归 1.1、概念 ‌‌线性回归算法是一种统计分析方法&#xff0c;用于确定两种或两种以上变量之间的定量关系。‌ 线性回归算法通过建立线性方程来预测因变量&#xff08;y&#xff09;和一个或多个自变量…

Android中同步屏障(Sync Barrier)介绍

在 Android 中&#xff0c;“同步屏障”&#xff08;Sync Barrier&#xff09;是 MessageQueue 中的一种机制&#xff0c;允许系统临时忽略同步消息&#xff0c;以便优先处理异步消息。这在需要快速响应的任务&#xff08;如触摸事件和动画更新&#xff09;中尤为重要。 在 An…

突破职场瓶颈,实现个人成长

在职场生涯中&#xff0c;我们总会遇到各种各样的瓶颈。这些瓶颈如同成长道路上的荆棘&#xff0c;让我们感到困惑、焦虑甚至恐惧。然而&#xff0c;瓶颈并非无法逾越&#xff0c;只要我们掌握正确的方法&#xff0c;勇敢面对&#xff0c;就能顺利突破&#xff0c;实现个人成长…

ubuntu 24.04中安装 Easyconnect,并解决版本与服务器不匹配问题

下载安装包 下载地址 https://software.openkylin.top/openkylin/yangtze/pool/all/ 页面搜索 easyconnect 选择 easyconnect_7.6.7.3.0_amd64.deb安装 sudo dpkg --install easyconnect_7.6.7.3.0_amd64.deb卸载 sudo dpkg --remove easyconnect出现的问题 安装以后第…

判断是否是变位词

题目&#xff1a;给定两个单词&#xff0c;判断这两个单词是否是变位词。如果两个单词的字母完全相同&#xff0c;只是位置有所不同&#xff0c;则称这两个单词为变位词。例如eat和tea是变位词。 答&#xff1a;问题分析&#xff1a;判断是否为变位词&#xff0c;只需要分别统计…

解决python matplotlib画图无法显示中文的问题

在用matplotlib做一个简单的可视化统计时&#xff0c;由于标签是中文&#xff0c;无法显示&#xff0c;只是显示出来一些方框&#xff08;如图&#xff09; 问题在于&#xff0c;当前matplotlib使用的字体不支持中文&#xff0c;我们进行替换就可以了 我想替换为黑体&#xff…

Docker:网络

Docker&#xff1a;网络 Docker 网络架构CNMLibnetwork驱动网络类型 命令docker network lsdocker network inspectdocker network createdocker network connectdocker network disconnectdocker network prunedocker network rm 网络操作bridgehostcontainernone Docker 网络…

力扣排序268题 数字丢失

题目&#xff1a; 丢失的数字 给定一个包含[0,n]中n各数的数组nums&#xff0c;找出[0,n]这个范围 内没有出现在数组中的那个数。 示例1&#xff1a; 输出&#xff1a;n 3,因为有3个数字&#xff0c;所以所有的数字都在范围 [0,3]内。2是丢失的数字&#xff0c;因为它没有出现…