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

【Leetcode 每日一题】2680. 最大或值

问题背景

给你一个下标从 0 0 0 开始长度为 n n n 的整数数组 n u m s nums nums 和一个整数 k k k。每一次操作中,你可以选择一个数并将它乘 2 2 2
你最多可以进行 k k k 次操作,请你返回 n u m s [ 0 ] ∣ n u m s [ 1 ] ∣ . . . ∣ n u m s [ n − 1 ] nums[0] | nums[1] | ... | nums[n - 1] nums[0]nums[1]∣...∣nums[n1] 的最大值。
a ∣ b a | b ab 表示两个整数 a a a b b b按位或 运算。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 1 0 9 1 \le nums[i] \le 10 ^ 9 1nums[i]109
  • 1 ≤ k ≤ 15 1 \le k \le 15 1k15

解题过程

要求最终或运算的结果最大,应该尽可能地增加它的二进制长度。
2 2 2 和左移是完全等价的,集中对一个数进行不断地左移要比对多个数分散操作更有可能增加数字的二进制长度。
所以只需要遍历并讨论对每个数字进行操作得到的结果,取最大值即可。
要快速计算某个位置上的或运算结果,除了它本身左移之后的数值,还需要它的前后缀或运算结果。为了快速计算,可以先处理好前后缀的值。

具体实现

class Solution {
    public long maximumOr(int[] nums, int k) {
        int n = nums.length;
        int[] sufOrSum = new int[n];
        for (int i = n - 2; i >= 0; i--) {
            sufOrSum[i] = sufOrSum[i + 1] | nums[i + 1];
        }

        long res = 0;
        int preOrSum = 0;
        for (int i = 0; i < n; i++) {
            res = Math.max(res, preOrSum | ((long) nums[i] << k) | sufOrSum[i]);
            preOrSum |= nums[i];
        }
        return res;
    }
}

相关文章:

  • 组合总和
  • 理解 Node.js 中的 process`对象与常用操作
  • 系统思考—链接组织效能提升与问题解决
  • VideoHelper 油猴脚本,重塑你的视频观看体验
  • 51c~C++合集1
  • 【CSS文字渐变动画】
  • 无人机点对点技术要点分析!
  • xwiki自定义认证实现单点登录
  • XSS介绍通关XSS-Labs靶场
  • 分页优化之——游标分页
  • IREE 内存分配算法概述
  • 深入理解MySQL中的MVCC机制
  • 双一流软件工程大二听闻 Java 前景堪忧,是否该转C++或人工智能或者读研?
  • 数据驱动的业务智能与决策支持:从数据到智慧的进化之路
  • JDBC 操作 BLOB(二进制大对象)和 CLOB(字符大对象)的完整示例代码,包含 插入、读取 操作及详细注释
  • RocketMQ面试题:基础部分
  • G-Star 校园开发者计划·黑科大|开源第一课之 Git 入门
  • 简易shell
  • Python深浅拷贝
  • mysql 查询进程查看并释放
  • 新消费观察| 零售品牌 “走出去” ,如何开辟“新蓝海”?
  • 媒体起底“速成洋文凭”灰产链,专家:我们要给学历“祛魅”
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号
  • 外交部发言人就当前印巴局势答记者问
  • 李云泽:支持小微企业、民企融资一揽子政策将从增供给、降成本、提效率、优环境4个方面发力
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热