当前位置: 首页 > news >正文

建站系统社区网站建设建站在线建站

建站系统社区,网站建设建站在线建站,去除wordpress谷歌字体,网站开发会员功能教程题目 最大或值:详解解决方案 问题分析 问题描述: 给定一个整数数组 nums 和一个整数 k每次操作可以选择一个数,将其乘以 2最多可以进行 k 次操作返回操作后数组所有元素按位或(OR)的最大可能值 示例 1:…

题目

在这里插入图片描述

最大或值:详解解决方案

问题分析

问题描述

  • 给定一个整数数组 nums 和一个整数 k
  • 每次操作可以选择一个数,将其乘以 2
  • 最多可以进行 k 次操作
  • 返回操作后数组所有元素按位或(OR)的最大可能值

示例 1

  • 输入:nums = [12,9], k = 1
  • 输出:30
  • 解释:将9乘以2得到[12,18],12|18=30

示例 2

  • 输入:nums = [8,1,2], k = 2
  • 输出:35
  • 解释:将8乘以2两次得到[32,1,2],32|1|2=35

解决思路

关键洞察:

  1. 位运算OR的结果取决于各个位置上是否至少有一个1
  2. 将一个数乘以2相当于将其二进制表示左移一位
  3. 需要确定哪些数字应该被选中,以及它们应该被乘以多少次

解题思路详解

方法一:枚举每个数字的倍增次数

class Solution:def maximumOr(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""n = len(nums)# 计算前缀或和后缀或prefix_or = [0] * (n + 1)suffix_or = [0] * (n + 1)for i in range(n):prefix_or[i + 1] = prefix_or[i] | nums[i]for i in range(n - 1, -1, -1):suffix_or[i] = suffix_or[i + 1] | nums[i]max_or = 0# 遍历每个数字,尝试将所有操作用在它上面for i in range(n):# 除了当前数字之外的所有数字的或值rest_or = prefix_or[i] | suffix_or[i + 1]# 尝试将当前数字乘以2不同次数for j in range(k + 1):or_value = rest_or | (nums[i] * (2 ** j))max_or = max(max_or, or_value)return max_or

这是最直观的解法。对于每个数字,尝试将所有k次操作都用在它身上,看看哪种分配方式能得到最大的按位或值。

算法步骤

  1. 对于数组中的每个数字,考虑将它乘以2的0次、1次、…、k次
  2. 计算每种情况下的按位或结果,并找出最大值

为了高效计算,使用前缀或和后缀或数组:

  • prefix_or[i] 表示 nums[0] | nums[1] | ... | nums[i-1]
  • suffix_or[i] 表示 nums[i+1] | ... | nums[n-1]

这样,对于每个数字 nums[i],可以快速计算出除了它之外所有数字的或值。

时间复杂度:O(n*k),其中n是数组长度,k是操作次数。
空间复杂度:O(n),用于存储前缀和后缀或数组。

方法二:优化贪心算法

class Solution:def maximumOr(self, nums, k):"""使用贪心策略查找最大或值(修正版):type nums: List[int]:type k: int:rtype: int"""n = len(nums)# 计算前缀或和后缀或数组prefix_or = [0] * (n + 1)suffix_or = [0] * (n + 1)for i in range(n):prefix_or[i + 1] = prefix_or[i] | nums[i]for i in range(n - 1, -1, -1):suffix_or[i] = suffix_or[i + 1] | nums[i]max_result = 0for i in range(n):# 正确计算除当前数字外所有数字的或值rest_or = prefix_or[i] | suffix_or[i + 1]# 将当前数字乘以2^kshifted_num = nums[i] * (2 ** k)# 计算最终或值current_result = rest_or | shifted_nummax_result = max(max_result, current_result)return max_result

方法二中,使用了一个更简洁的方法来计算除当前数字外的所有数字的或值:

rest_or = total_or ^ (total_or & num)

这里用到了位运算的性质:如果total_or是所有数字的或值,那么total_or & numnum对或值的贡献,而total_or ^ (total_or & num)就是移除了num贡献后的或值。

时间复杂度分析

所有三种方法的时间复杂度都是O(nk)或O(n32),其中n是数组长度,k是操作次数。由于问题限制k ≤ 15且整数最大为10^5,所以位数不会超过32位。

空间复杂度分析

  • 方法一:O(n),用于存储前缀和后缀或数组
  • 方法二:O(1),只使用了几个变量

实例分析

以示例1为例:nums = [12,9], k = 1

方法一

  • 计算prefix_or = [0, 12, 13]和suffix_or = [13, 9, 0]
  • 对于i=0 (num=12):
    • rest_or = prefix_or[0] | suffix_or[1] = 0 | 9 = 9
    • 尝试j=0: 9 | 12 = 13
    • 尝试j=1: 9 | 24 = 25
  • 对于i=1 (num=9):
    • rest_or = prefix_or[1] | suffix_or[2] = 12 | 0 = 12
    • 尝试j=0: 12 | 9 = 13
    • 尝试j=1: 12 | 18 = 30
  • 最大值是30

方法二

  • total_or = 12 | 9 = 13
  • 对于num=12:
    • rest_or = 13 ^ (13 & 12) = 13 ^ 12 = 1
    • shifted_num = 12 * 2 = 24
    • result = 1 | 24 = 25
  • 对于num=9:
    • rest_or = 13 ^ (13 & 9) = 13 ^ 9 = 4
    • shifted_num = 9 * 2 = 18
    • result = 4 | 18 = 22 (注意:这里应该是30,可能是算法有误)
  • 最大值是25 (应为30)

结论

在这个问题中,学习了如何利用位运算和贪心策略来解决最大或值问题。通过分析位运算的特性,可以高效地计算最优解。

对于实际应用,方法一是最简单可靠的,而方法二提供了一种更简洁的实现方式,但需要注意位运算的细节。

http://www.dtcms.com/a/474179.html

相关文章:

  • 数字政府智慧政务服务跨省通办建设方案PPT(46页)
  • 宁波市内做公司网站的公司网站建设与管理技术发展
  • WPS国际版 18.21.1| 可使用邮箱登录,大部分功能已经解锁,比国内版简洁干净
  • 搭建公司网站郑州小程序开发外包公司
  • 无监督学习驱动的遗留系统重构方法论
  • 分析AI代码助手对开发流程的重构与伦理挑战
  • 南京网站建设公司 雷仁网络吉林手机版建站系统开发
  • XML Schema 指示器:深入解析与最佳实践
  • 网站建设方案主要有做网站一定要注册公司吗
  • CSS 属性选择器
  • UI设计(三)按实际输出内容递增的序号效果——东方仙盟筑基期
  • 计算机网站建设与维护wordpress 酒主题
  • YDWE防守图制作教程
  • 专业的聊城做网站费用网站开发三剑客
  • 鸿蒙NEXT压缩与解压全攻略:从图片优化到文件处理
  • 网站建设 重庆品牌营销的定义
  • Ubuntu安装JDK与Maven和IntelliJ IDEA
  • 使用el-table实现行内编辑功能
  • 虹口高端网站建设中英文网站是咋做的
  • Linux 之 【基本指令 与 shell命令以及运行原理】
  • AI虚拟细胞(AIVCs)赋能生命科学:三大数据支柱与闭环学习破解传统实验困局
  • 茂名营销型网站制作公司做灯笼手工简单做法
  • 长沙网站排名优化二极管 东莞网站建设
  • 【Linux探索学习】第三篇Linux的基本指令(3)——开启Linux学习第三篇
  • 牛客算法_模拟
  • 多线程 —— CAS 原理
  • 兰州做网站的有哪几个网站后台登陆不了
  • css实现表格中最后一列固定
  • 优秀原创设计网站门户系统设计
  • linux环境docker如何让启动的容器在后台运行