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

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
给你一个正整数 p 。你有一个下标从 1 1 1 开始的数组 n u m s nums nums ,这个数组包含范围 [ 1 , 2 p − 1 ] [1, 2^p - 1] [1,2p1] 内所有整数的二进制形式(两端都 包含)。你可以进行以下操作 任意 次:

n u m s nums nums 中选择两个元素 x x x y y y
选择 x x x 中的一位与 y y y 对应位置的位交换。对应位置指的是两个整数 相同位置 的二进制位。
比方说,如果 x = 1101 x = 1101 x=1101 y = 0011 y = 0011 y=0011 ,交换右边数起第 2 2 2 位后,我们得到 x = 1111 x = 1111 x=1111 y = 0001 y = 0001 y=0001

请你算出进行以上操作 任意次 以后, n u m s nums nums 能得到的 最小非零 乘积。将乘积对 1 0 9 + 7 10^9 + 7 109+7 取余 后返回。

注意:答案应为取余 之前 的最小值。

示例 1:
输入:p = 1
输出:1
解释:nums = [1] 。
只有一个元素,所以乘积为该元素。

示例 2:
输入:p = 2
输出:6
解释:nums = [01, 10, 11] 。
所有交换要么使乘积变为 0 ,要么乘积与初始乘积相同。
所以,数组乘积 1 * 2 * 3 = 6 已经是最小值。

示例 3:
输入:p = 3
输出:1512
解释:nums = [001, 010, 011, 100, 101, 110, 111]

  • 第一次操作中,我们交换第二个和第五个元素最左边的数位。
  • 结果数组为 [001, 110, 011, 100, 001, 110, 111] 。
  • 第二次操作中,我们交换第三个和第四个元素中间的数位。
  • 结果数组为 [001, 110, 001, 110, 001, 110, 111] 。

数组乘积 1 * 6 * 1 * 6 * 1 * 6 * 7 = 1512 是最小乘积。

提示:
1 ≤ p ≤ 60 1 \leq p \leq 60 1p60

思路

首先我们要明确一点:通过交换位操作,我们希望得到的是一个最小非零乘积。接下来我们来分析一下贪心策略:

对于两个数 x x x y y y,如果我们将 y y y中除了最低位以外的所有位都赋值为1,那么交换后的结果将会使得乘积变小且非零。
为什么会这样呢?假设 x x x的参与交换的位是 000 000 000 y y y的参与交换的位是 111 111 111,交换后的结果中, x x x将变成 x + 2 k x+2^k x+2k y y y将变成 y ′ y' y,此时, ( x + 2 k ) × y ′ = x × y ′ + y ′ × 2 k (x+2^k) \times y' = x \times y' + y' \times 2^k (x+2k)×y=x×y+y×2k。对比之前的乘积,我们可以发现只要 y ′ < x y'<x y<x,交换后的乘积就会变小。因此,我们可以不断地将 y y y中的 111 111 111 x x x中的 000 000 000交换,使得 y y y变成 111 111 111,从而使得乘积变得最小。
基于这个思路,我们可以构造数组 n u m s nums nums,将 [ 1 , 2 p − 1 ] [1, 2^p - 1] [1,2p1]中的所有整数分为两组:小于 2 p − 1 2^p - 1 2p1的为一组 A A A,其余的为另一组 B B B。对于 B B B中的元素,除了 2 p − 1 2^p - 1 2p1以外,其余的数都可以和 A A A中的数一一配对,使得每对的和为 2 p − 1 2^p - 1 2p1。然后,我们对每一对进行交换操作,使得 B B B中的数变为 111 111 111。这样一来,我们得到了一个数组 n u m s nums nums,其中每一对的乘积都是 2 p − 2 2^p - 2 2p2,最终的乘积就是 ( 2 p − 1 ) × ( 2 p − 2 ) 2 p − 1 − 1 (2^p - 1) \times (2^p - 2)^{2^{p-1} - 1} (2p1)×(2p2)2p11

代码

class Solution {
    int mod = 1000000007;
    public: int minNonZeroProduct(int p) {
        long x = (1L << p) - 1;
        return (int) (myPow((x - 1) % mod, x >> 1) * (x % mod) % mod);
    }
    long myPow(long a, long b) {
        long res = 1;
        while (b > 0) {
            if ((b & 1) == 1) res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }
};

复杂度分析

时间复杂度

构造数组 n u m s nums nums的时间复杂度为 O ( 2 p ) O(2^p) O(2p),其中 2 p 2^p 2p为数组中元素的个数。
快速幂算法在计算 ( 2 p − 2 ) 2 p − 1 − 1 (2^p - 2)^{2^{p-1} - 1} (2p2)2p11时的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),其中 n = 2 p − 2 n = 2^p - 2 n=2p2
因此,总的时间复杂度为 O ( 2 p + log ⁡ n ) O(2^p + \log n) O(2p+logn)

空间复杂度

代码中只使用了常数额外的空间,因此空间复杂度为 O ( 1 ) O(1) O(1)

结果

执行结果

总结

通过贪心策略和数学推导,我们得到了一个简洁高效的解决方案。贪心策略是通过寻找最小非零乘积的最优交换方式,从而使得乘积变得最小。数学推导则是基于贪心策略得出了最终的乘积公式,通过快速幂算法高效地计算出结果。整体来说,这个解决方案在时间和空间上都表现出了较高的效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python-sc2】详细解析!!!手把手教你学会实现星际争霸2游戏AI智能体的基础知识!!!

参考资料 星际争霸2 AI机器人网站 AI天梯 sc2ai_wiki文档 该网站包含基于各种语言编写的sc2库&#xff0c;包括C、Python、C#、JAVA等。其中&#xff0c;Python有Python-sc2、sharpy-sc2和PySC2三种框架。此外&#xff0c;针对每个框架提供了教程。 python-sc2官方文档 各种族单…

Spring Cloud Gateway教程

1 微服务网关概述 Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务&#xff0c;旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能&#xff1a; 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…

目标检测——YOLOX算法解读

论文&#xff1a;YOLOX: Exceeding YOLO Series in 2021(2021.7.18) 作者&#xff1a;Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, Jian Sun 链接&#xff1a;https://arxiv.org/abs/2107.08430 代码&#xff1a;https://github.com/Megvii-BaseDetection/YOLOX YOLO系列算法…

爬虫案例-网站分词索引与站内搜索

文章目录 1.案例简介2.设计思路3.设计结构4.关键技术5.数据结构6.数据集合7.设计过程7.1 信息采集模块7.2 索引模块7.3 网页排名和搜索 8.示例效果 1.案例简介 本例使用Python建立一个指定网站专用的Web搜索引擎&#xff0c;它能爬取所有指定的网页信息&#xff0c;然后准确的…

智慧安全:守护智慧城市的安全屏障

随着信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发展的重要方向。智慧城市通过集成应用先进的信息通信技术&#xff0c;实现城市管理、服务、运行的智能化&#xff0c;为城市的可持续发展注入了新的活力。然而&#xff0c;在智慧城市的建设过程中&#xff0c;安全问…

综合案例-淘宝轮播图

代码&#x1f447; <!DOCTYPE html><html lang"en" xmlns"http://www.w3.org/1999/xhtml"> <head><meta charset"utf-8" /><title>淘宝轮播图</title><style>*{margin:0px;padding:0px;}.tb-promo {…

流畅的 Python 第二版(GPT 重译)(四)

第二部分&#xff1a;函数作为对象 第七章&#xff1a;函数作为一等对象 我从未认为 Python 受到函数式语言的重大影响&#xff0c;无论人们说什么或想什么。我更熟悉命令式语言&#xff0c;如 C 和 Algol 68&#xff0c;尽管我将函数作为一等对象&#xff0c;但我并不认为 Py…

Java 设计模式系列:行为型-中介者模式

简介 中介者模式是一种行为型设计模式&#xff0c;它定义了一个中介对象&#xff0c;用于简化对象之间的交互。中介者模式通过引入一个中介对象来解耦多个对象之间的交互&#xff0c;使得这些对象可以独立地改变和复用。 中介者模式的适用场景包括多个对象之间存在复杂的引用…

asp.net在线租车平台

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net在线租车平台 用户功能有首页 行业新闻用户注册车辆查询租车介绍访问后台 后台管理员可以进行用户管理 管…

xinput1_3.dll丢失如何修复,xinput1_3.dll的安装修复教程分享

在Windows操作系统环境下&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到xinput13.dll”。由于xinput1_3.dll是微软DirectX SDK的一部分&#xff0c;主要用于支持游戏手柄和其他外部设备的输入功能&#xff0c;缺失这一动态链接库文件可能导致某些依赖…

【WEB3安全基建项目Secwarex】空投指南

GoPlusSecurity是WEB3安全基建项目&#xff0c;3月8日完成400万美元的私募融资&#xff0c;目前总融资已经高达1500万美元&#xff0c;其中包括Binance Labs、Huobi Incubator、Kucoin Ventures、Avalanche等知名机构参投。 1、打开网址&#xff1a;secwarex.io&#xff0c;点…

node.js常用的命令

Node.js 是一个用于执行 JavaScript 代码的运行时环境。以下命令是 Node.js 开发中常用的命令&#xff0c;可以帮助你进行包管理、项目配置和代码执行等操作。 node -v&#xff1a;检查 Node.js 的版本。npm -v&#xff1a;检查 npm&#xff08;Node.js 包管理器&#xff09;的…

通配符ssl证书有哪几种

通配符SSL证书是数字证书中比较特别的一种。它可以同时保护主域名以及主域名下所有的子域名&#xff0c;对所保护的网站传输数据进行加密。在证书有效期内&#xff0c;通配符SSL证书还可以免费增加子域名站点。随着互联网的发展&#xff0c;越来越多的个人和企事业单位的开发者…

01.Queue-Basic

1. 队列简介 队列&#xff08;Queue&#xff09;&#xff1a;一种线性表数据结构&#xff0c;是一种只允许在表的一端进行插入操作&#xff0c;而在表的另一端进行删除操作的线性表。 我们把队列中允许插入的一端称为 「队尾&#xff08;rear&#xff09;」&#xff1b;把允许删…

nginx使用与配置文件

nginx服务配置与配置优化 nginx服务脚本配置 mkdir wwwroot cd wwwroot/ mkdir nginx1 touch index.php vim index.php<?php echo $_SERVER["REMOTE_ADDR"]; ​ ​ vim conf/nginx.confserver {listen 80;server_name localhost;root /www/wwwroot/nginx…

分布式之SleuthZipkin

Sleuth&Zipkin 学习当前课程&#xff0c;比必须要先掌握SpringCloud的基本应用&#xff08;Nacos&#xff0c;Feign调用&#xff09; 对Docker有一定的了解&#xff0c;知道docker-compose.yml如何启动一个容器 RabbitMQ&#xff0c;Elasticsearch有一定了解。 而且学习…

SQLiteC/C++接口详细介绍sqlite3_stmt类(五)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;四&#xff09;- 下一篇&#xff1a; 无 12. sqlite3_bind_text16函数 sqlite3_bind_text16函数用于将UTF-16编码的文本数据&#xff08;字符串&#xff09;绑定…

HTML,子元素使用float后,导致父元素高度塌陷

HTML学习中遇到的一个任务&#xff1a;header 标签有两个元素 div&#xff08;标题&#xff09; 和 nav&#xff08;导航&#xff09;&#xff0c;希望实现的效果是标题在左侧&#xff0c;导航在右侧。 基础代码如下&#xff1a; <!DOCTYPE html> <html><head&…

辐射展—2024深圳辐射监测与防护展览会

2024深圳辐射监测与防护展览会 展会时间&#xff1a;2024年5月15-17日 展会地点&#xff1a;深圳国际会展中心&#xff08;宝安&#xff09; 主办单位&#xff1a;广东省辐射防护协会 广东省环境监测协会 深圳中国环境监测总站技术创新研究院&#xff08;福田&#xff09;…

mysql未完成事务查看

因为MySQL的事务管理主要是基于InnoDB存储引擎的&#xff0c;并且事务的状态&#xff08;例如&#xff0c;是否已提交或回滚&#xff09;通常是内部的、不直接暴露给用户的,但是可以通过一些方法间接地检查或诊断与事务相关的问题 查看正在运行的事务 使用SHOW ENGINE INNODB…
最新文章