LeetCode 刷题 --- 快速幂

news2024/9/8 23:56:31

前言

幂运算是一种常见的运算,求取a^n,最容易想到的方法便是通过循环逐个累乘,其复杂度为O(n),这在很多时候是不够快的,所以我们需要一种算法来优化幂运算的过程。

快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在O(logn)的时间内计算a^n的小技巧。

解释

如下计算公式,无需多言

那么计算一个数的n次幂的时候,就可以将n转化为二进制数,比如计算

因此,计算3^13,只要将对应的二进制位为1的整数幂 乘起来就行了

实现

经过以上的介绍,快速幂的代码实现就比较容易了:

// 计算x 的 n 次幂
public static double fastPow(int x, int n) {
    // 0的任何次幂都是0
    if (x == 0) {
        return 0;
    }
    // 非0的零次幂是1
    if (n == 0) {
        return 1;
    }
    // 负数次幂计算
    if (n < 0) {
        x = 1 / x;
        n = -n;
    }

    double res = 1.0;
    while (n > 0) {
        // 当前n的最低位不是0,最终结果就要乘以这个值
        if ((n & 1) == 1) {
            res *= x;
        }

        // 从低到高位进行运算,低位运算完了,就要到高一位了
        n = n >> 1;
        // 高一位的值,也就是计算结果要乘以的值。
        x *= x;
    }
    return res;
}

实战

1969. 数组元素的最小非零乘积

思路:

1、首先假设给定三个正整数 a,b,,c,满足 a<b<c,此时需要将某个数缩小 1,另外一个数增加 1,使得 abc 最小,如何选择才是最优选择?---> 最优解其实就是大数加1,小数减1。即(a-1)b(c+1)。

2、回到本题,两个数在进行相同的位交换的时候,本质就是将一个数减小2^k,另外一个数增大2^k,我们可以知道一种贪心思路:进行相同位交换时,优先缩小数组中最小的元素,再增加数组中最大的元素

    public static int minNonZeroProduct(int p) {
        if (p == 1) {
            return 1;
        }

        // 题目给的取余数
        int mod = 1000000007;
        // 数组最后一个值
        long last = fastPow(2, p, mod) - 1;

        // 需要计算的数目,注意这里不能用快速幂计算,因为用了余数取模,算出来的数目大于模数的时候就不准了
        long binarySize = (long) 1 << (p - 1);
        binarySize = binarySize - 1;

        // 结果
        return (int) (fastPow(last - 1, binarySize, mod) * last % mod);

    }

    public static long fastPow(long x, long n, int mod) {
        long res = 1l;
        while (n > 0) {
            if ((n & 1) == 1) {
                res = res * x % mod;
            }
            n = n >> 1;
            x = x * x % mod;
        }
        return res;
    }

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

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

相关文章

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结 模糊图像增强技术之去噪声类滤波场景应用小结—【蘇小沐】 文章目录 【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结&#xff08;一&#xff09;去噪声类滤波器1、去块滤波器&#xff08;Deblo…

基于Vue.js和D3.js的智能停车可视化系统

引言 随着物联网技术的发展&#xff0c;智能停车系统正逐渐普及。前端作为用户交互的主要界面&#xff0c;对于提供直观、实时的停车信息至关重要。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 首先&#xff0c;确保您的开发环境已经安装了Node.js和npm。然后&…

Qt 多元素控件

Qt开发 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件. QTableView 自身不持有数据. 使用QTableView 的 …

Prometheus 配置Basic auth认证

官方配置说明&#xff1a; Basic auth | Prometheus 一、生成密码加密串 Prometheus于2.24版本&#xff08;包括2.24&#xff09;之后提供Basic Auth功能进行加密访问&#xff0c;在浏览器登录UI的时候需要输入用户密码&#xff0c;访问Prometheus api的时候也需要加上用户密…

Qt 鼠标滚轮示例

1.声明 void wheelEvent(QWheelEvent *event) override;2.实现&#xff08;方便复制、测试起见用静态变量&#xff09; #include <mutex> void MainWindow::wheelEvent(QWheelEvent *event) {static QLabel *label new QLabel("Zoom Level: 100%", this);st…

Cesium for UE-01-虚幻引擎的下载安装及插件配置

学习Cesium for UE的过程笔记 下载UE 下载 下载完成后&#xff0c;点击运行&#xff0c;执行安装 安装完成后需要下载epic game 下载完成&#xff0c;需要登录 没有账号的自行注册&#xff0c;或者选一个有账号的平台登录即可 选择虚幻引擎&#xff0c;再点击库 可以看到下…

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展

在一项旨在显著改善 DeFi 生态的战略举措中&#xff0c;Cronos 与 Covalent Network&#xff08;CQT&#xff09;携手合作&#xff0c;以期待 Cronos zkEVM 的推出。这一整合&#xff0c;预计将进一步降低以太坊生态系统的交易成本、提升交易速度&#xff0c;并带来更好的交易体…

全面:vue.config.js 的完整配置

vue.config.js是Vue项目的配置文件&#xff0c;用于配置项目的构建、打包和开发环境等。 在Vue CLI 3.0之后&#xff0c;项目的配置文件从原来的build和config目录下的多个配置文件&#xff0c;合并成了一个vue.config.js文件。这个文件可以放在项目的根目录下&#xff0c;用于…

FPGA学习_Xilinx7系列FPGA基本结构

文章目录 前言一、7系列FPGA介绍1.1、芯片编号 二、基本组成单元2.1、可编程逻辑块CLB&#xff08;Configable Logic Block&#xff09;2.2、可编程输入输出单元&#xff08;IOB&#xff09;2.3、嵌入式块RAM&#xff08;Block RAM&#xff09;2.4、底层内嵌功能单元2.5、内嵌专…

变配电站配电监控解决方案--变电站综合自动化系统

变电站综合自动化系统 Acrel-1000变电站综合自动化监控系统是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人或少人值守功能…

基于SpringBoot的街道办管理系统

摘 要 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的街道办管理系统。当前的信息管理存在工作…

NodeJS 集群模块: 为App创建集群实例

NodeJS 集群模块: 为App创建集群实例 目录 NodeJS 集群模块: 为App创建集群实例Node.js 集群介绍:终极扩展策略使用集群模块开始扩展 Node.js扩展 Node.js 的两种集群策略使用集群受益的 Node.js 应用程序示例没有集群的 Node.js:不可伸缩的原则集群操作:一个扩展的 Node.js…

Redis的分片机制

Redis的分片机制 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持键值对的存储方式。Redis的分片机制允许将数据在多个节点上进行分布式存储和处理&#xff0c;从而提高系统的性能和可扩展性。 Redis的分片机制是通过一致性哈希算法实现的。一致性哈希算法将所有的ke…

vue2 脚手架

安装 文档&#xff1a;https://cli.vuejs.org/zh/ 第一步&#xff1a;全局安装&#xff08;仅第一次执行&#xff09; npm install -g vue/cli 或 yarn global add vue/cli 备注&#xff1a;如果出现下载缓慢&#xff1a;请配置npm 淘宝镜像&#xff1a; npm config set regis…

EFcore的实体类配置

1 约定配置 约定大于配置&#xff0c;框架默认了许多实体类配置的规则&#xff0c;在约定规则不满足要求时&#xff0c;可以显示地定义规则 1 数据库表明在不指定的情况下&#xff0c;默认使用的是数据库上下文类【DBContext】中DbSet 的属性名&#xff1b; 2 数据库表列的名字…

大数据开发--02.环境准备

一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例&#xff0c;配置静态ip地址&#xff0c;其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置&#xff0c; 4.然…

使用Dockerfile打包java项目生成镜像部署到Linux

1、Dockerfile 介绍 如果说容器就是“小板房”&#xff0c;镜像就是“样板间”。那么&#xff0c;要造出这个“样板间”&#xff0c;就必然要有一个“施工图纸”&#xff0c;由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。 比起容…

【MySql实战--日志系统:一条SQL更新语句是如何执行的?】

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是怎…

Apache Superset

前言 最近在准备一个小的项目&#xff0c;需要对 Hive 的数据进行展示&#xff0c;所以想到了把 Hive 的数据导出到 MySQL 然后用 Superset 进行展示。 Superset 1.1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接…

基于WTR096-28SS芯片方案的宠物喂食器实现智能化喂食功能

一、简介 本方案宠物喂食器采用了WTR096-28SS芯片方案来实现智能化的喂食功能。该方案结合了先进的技术和设计理念&#xff0c;提供了便捷、智能和个性化的宠物喂食解决方案。 该宠物喂食器具备定时、定量喂食功能&#xff0c;可以根据主人设定的时间和食物量&#xff0c;自动…