位运算题目:找到最接近目标值的函数值

news2025/7/19 7:20:45

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:找到最接近目标值的函数值

出处:1521. 找到最接近目标值的函数值

难度

8 级

题目描述

要求

函数

Winston 构造了一个如上所示的函数 func \texttt{func} func。他有一个整数数组 arr \texttt{arr} arr 和一个整数 target \texttt{target} target,他想找到让 ∣ func(arr,   l,   r) − target ∣ \big| \texttt{func(arr, l, r)} - \texttt{target} \big| func(arr, l, r)target 最小的 l \texttt{l} l r \texttt{r} r

返回 ∣ func(arr,   l,   r) − target ∣ \big| \texttt{func(arr, l, r)} - \texttt{target} \big| func(arr, l, r)target 的最小值。

注意 func \texttt{func} func 的输入参数包含 l \texttt{l} l r \texttt{r} r,满足 0 ≤ l,   r < arr.length \texttt{0} \le \texttt{l, r} < \texttt{arr.length} 0l, r<arr.length

示例

示例 1:

输入: arr   =   [9,12,3,7,15],   target   =   5 \texttt{arr = [9,12,3,7,15], target = 5} arr = [9,12,3,7,15], target = 5
输出: 2 \texttt{2} 2
解释:所有可能的 [l,r] \texttt{[l,r]} [l,r] 数对包括 [[0,0],[1,1],[2,2],[3,3],[4,4],[0,1],[1,2],[2,3],[3,4],[0,2],[1,3],[2,4],[0,3],[1,4],[0,4]] \texttt{[[0,0],[1,1],[2,2],[3,3],[4,4],[0,1],[1,2],[2,3],[3,4],[0,2],[1,3],[2,4],[0,3],[1,4],[0,4]]} [[0,0],[1,1],[2,2],[3,3],[4,4],[0,1],[1,2],[2,3],[3,4],[0,2],[1,3],[2,4],[0,3],[1,4],[0,4]],Winston 得到的相应结果为 [9,12,3,7,15,8,0,3,7,0,0,3,0,0,0] \texttt{[9,12,3,7,15,8,0,3,7,0,0,3,0,0,0]} [9,12,3,7,15,8,0,3,7,0,0,3,0,0,0]。最接近 5 \texttt{5} 5 的值是 7 \texttt{7} 7 3 \texttt{3} 3,所以最小差值为 2 \texttt{2} 2

示例 2:

输入: arr   =   [1000000,1000000,1000000],   target   =   1 \texttt{arr = [1000000,1000000,1000000], target = 1} arr = [1000000,1000000,1000000], target = 1
输出: 999999 \texttt{999999} 999999
解释:Winston 输入函数的所有可能 [l,r] \texttt{[l,r]} [l,r] 数对得到的函数值都为 1000000 \texttt{1000000} 1000000,所以最小差值为 999999 \texttt{999999} 999999

示例 3:

输入: arr   =   [1,2,4,8,16],   target   =   0 \texttt{arr = [1,2,4,8,16], target = 0} arr = [1,2,4,8,16], target = 0
输出: 0 \texttt{0} 0

数据范围

  • 1 ≤ arr.length ≤ 10 5 \texttt{1} \le \texttt{arr.length} \le \texttt{10}^\texttt{5} 1arr.length105
  • 1 ≤ arr[i] ≤ 10 6 \texttt{1} \le \texttt{arr[i]} \le \texttt{10}^\texttt{6} 1arr[i]106
  • 0 ≤ target ≤ 10 7 \texttt{0} \le \texttt{target} \le \texttt{10}^\texttt{7} 0target107

解法

思路和算法

n n n 表示数组 arr \textit{arr} arr 的长度。如果枚举所有的下标对 ( l , r ) (l, r) (l,r),则时间复杂度至少是 O ( n 2 ) O(n^2) O(n2),该时间复杂度过高,需要优化。

如果子数组的右侧端点 r r r 固定,分别考虑两个左侧端点 l 1 l_1 l1 l 2 l_2 l2 对应的函数值。当 l 1 < l 2 ≤ r l_1 < l_2 \le r l1<l2r 时,记 v 1 = func ( arr , l 1 , r ) v_1 = \textit{func}(\textit{arr}, l_1, r) v1=func(arr,l1,r) v 2 = func ( arr , l 2 , r ) v_2 = \textit{func}(\textit{arr}, l_2, r) v2=func(arr,l2,r),则一定有 v 1 ≤ v 2 v_1 \le v_2 v1v2,理由如下。

对于 c = a   &   b c = a ~\&~ b c=a & b,考虑二进制表示的每一位,只有当 a a a b b b 在同一位的值都是 1 1 1 时, c c c 在该位的值才是 1 1 1,否则 c c c 在该位的值是 0 0 0,因此 c ≤ a c \le a ca c ≤ b c \le b cb。根据 func \textit{func} func 的定义有 v 1 = v 2   &   ( arr [ l 1 ]   &   arr [ l 1 + 1 ]   &   …   &   arr [ l 2 − 1 ] ) v_1 = v_2 ~\&~ (\textit{arr}[l_1] ~\&~ \textit{arr}[l_1 + 1] ~\&~ \ldots ~\&~ \textit{arr}[l_2 - 1]) v1=v2 & (arr[l1] & arr[l1+1] &  & arr[l21]),利用按位与运算的性质可得 v 1 ≤ v 2 v_1 \le v_2 v1v2

因此,当子数组的右侧端点固定时,当左侧端点向左移动时函数值不变或减少,当左侧端点向右移动时函数值不变或增加。当左侧端点向左移动时,函数值的二进制表示的每一位只可能不变或从 1 1 1 变成 0 0 0,不可能从 0 0 0 变成 1 1 1,因此当子数组的右侧端点 r r r 固定时,不同的函数值个数不超过 O ( log ⁡ arr [ r ] ) O(\log \textit{arr}[r]) O(logarr[r])

m m m 表示数组 arr \textit{arr} arr 的最大值。利用上述结论,将数组 arr \textit{arr} arr 中的每个元素作为子数组的右侧端点时只需要考虑 O ( log ⁡ m ) O(\log m) O(logm) 个不同的函数值,不需要考虑 O ( n ) O(n) O(n) 个不同的函数值,可以将时间复杂度从 O ( n 2 ) O(n^2) O(n2) 降低到 O ( n log ⁡ m ) O(n \log m) O(nlogm)

具体做法是,将子数组的右侧端点初始化为 0 0 0,此时函数值为 arr [ 0 ] \textit{arr}[0] arr[0],计算 ∣ arr [ 0 ] − target ∣ \big| \textit{arr}[0] - \textit{target} \big| arr[0]target ,作为函数值与目标值的最小差值。对于 i i i 1 1 1 n − 1 n - 1 n1,将 i i i 作为子数组的右侧端点,当前轮的函数值包括上一轮的每个函数值分别与 arr [ i ] \textit{arr}[i] arr[i] 的按位与运算结果,以及 arr [ i ] \textit{arr}[i] arr[i],计算当前轮的每个函数值与目标值的差的绝对值,更新最小差值。

实现方面,区分上一轮的函数值和当前轮的函数值的做法有多种,可以创建两个列表分别存储上一轮的函数值和当前轮的函数值,也可以使用队列存储函数值。使用队列的做法如下。

  1. 当遍历到 arr [ i ] \textit{arr}[i] arr[i] 时,队列中的元素为上一轮的所有函数值,记录此时队列的大小 size \textit{size} size

  2. size \textit{size} size 个元素出队列,将每个出队列的元素和 arr [ i ] \textit{arr}[i] arr[i] 做按位与运算得到当前轮的函数值,将当前轮的函数值入队列。

  3. 最后将 arr [ i ] \textit{arr}[i] arr[i] 入队列,表示 l = r = i l = r = i l=r=i 的情况下对应的函数值。

将当前轮的函数值入队列时需要排除重复元素。由于遍历函数值的顺序具有单调性,因此相等的函数值在遍历顺序中一定相邻,每次将函数值入队列时判断当前函数值与上一个入队列的函数值是否相等,即可排除重重复元素。

代码

class Solution {
    public int closestToTarget(int[] arr, int target) {
        int minDiff = Math.abs(arr[0] - target);
        Queue<Integer> queue = new ArrayDeque<Integer>();
        queue.offer(arr[0]);
        int length = arr.length;
        for (int i = 1; i < length; i++) {
            int num = arr[i];
            int size = queue.size();
            int lastVal = -1;
            for (int j = 0; j < size; j++) {
                int prevVal = queue.poll();
                int currVal = prevVal & num;
                if (currVal != lastVal) {
                    minDiff = Math.min(minDiff, Math.abs(currVal - target));
                    queue.offer(currVal);
                    lastVal = currVal;
                }
            }
            if (num != lastVal) {
                minDiff = Math.min(minDiff, Math.abs(num - target));
                queue.offer(num);
            }
        }
        return minDiff;
    }
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ m ) O(n \log m) O(nlogm),其中 n n n 是数组 arr \textit{arr} arr 的长度, m m m 是数组 arr \textit{arr} arr 的最大值。遍历数组的过程中,对于每个元素需要 O ( log ⁡ m ) O(\log m) O(logm) 的时间计算以当前元素作为结尾的所有函数值,因此时间复杂度是 O ( n log ⁡ m ) O(n \log m) O(nlogm)

  • 空间复杂度: O ( log ⁡ m ) O(\log m) O(logm),其中 m m m 是数组 arr \textit{arr} arr 的最大值。空间复杂度主要取决于队列,队列中的元素个数不超过 O ( log ⁡ m ) O(\log m) O(logm)

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

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

相关文章

哲学物理:太极图和莫比乌斯环有什么关系?

太极图 是中国传统文化中的经典符号,由阴阳两部分组成,黑白两色相互环绕,中间有两点表示阴中有阳,阳中有阴。太极图象征着对立统一、相互依存和动态平衡,是道家哲学的核心思想之一。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/477e67d70c2b4383bac3e12c8a6…

机器学习笔记1

一、 机器学习介绍与定义 1. 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;本质上就是让计算机自己在数据中学习规律&#xff0c;并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep…

JVM中的安全点是什么,作用又是什么?

JVM中的安全点&#xff08;Safepoint&#xff09; 是Java虚拟机设计中的一个关键机制&#xff0c;主要用于协调所有线程的执行状态&#xff0c;以便进行全局操作&#xff08;如垃圾回收、代码反优化等&#xff09;。它的核心目标是确保在需要暂停所有线程时&#xff0c;每个线程…

关于github使用总结

文章目录 一、本地使用git&#xff08;一&#xff09;创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 &#xff08;二&#xff09;在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…

2024年9月电子学会等级考试五级第三题——整数分解

题目 3、整数分解 正整数 N 的 K-P 分解是指将 N 写成 K 个正整数的 P 次方的和。本题就请你对任意给定的正整数 N、K、P&#xff0c;写出 N 的 K-P 分解。 时间限制&#xff1a;8000 内存限制&#xff1a;262144 输入 输入在一行给出 3 个正整数 N (≤ 400)、K (≤ N)、P (1 …

毕设设计 | 管理系统图例

文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java虚拟机&#xff09;退出的情况通常是…

实验6 电子邮件

实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端&#xff0c;以及服务器之间的通信 分析理解SMTP&#xff0c;POP3协议 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1a;Linux/ Windows 操作系统 3、实验内容…

深入理解浏览器渲染引擎:底层机制与性能优化实战

现代浏览器背后是一个庞大而复杂的系统工程&#xff0c;渲染引擎作为核心模块之一&#xff0c;承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发&#xff0c;系统梳理渲染引擎&#xff08;如 Blink&#xff09;工作原理、V8 与渲染流程的协作方式&#x…

大模型浪潮下,黑芝麻智能高性能芯片助力汽车辅助驾驶变革

在全球汽车产业向智能化、网联化加速转型的浪潮中&#xff0c;大模型技术的崛起为汽车领域带来了前所未有的变革机遇。黑芝麻智能在高性能芯片和基础软件架构领域的持续创新&#xff0c;正全力推动汽车智能化的发展&#xff0c;为行业注入新的活力。 大模型全面助力辅助驾驶迈…

康谋分享 | 自动驾驶仿真进入“标准时代”:aiSim全面对接ASAM OpenX

目录 一、OpenDRIVE&#xff1a;兼容多版本地图标准 &#xff08;1&#xff09;Atlas 工作流 &#xff08;2&#xff09;UE Plugin 工作流 二、OpenSCENARIO&#xff1a;标准化动态行为建模 三、OpenCRG&#xff1a;还原毫米级路面细节 四、OpenMATERIAL&#xff1a;更真…

GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署

随着人工智能技术的迅猛发展&#xff0c;特别是在自然语言处理领域&#xff0c;大型语言模型如DeepSeek-R1-70B的出现&#xff0c;推动了各行各业的变革。为了应对这些庞大模型的计算需求&#xff0c;云计算平台的普及成为了关键&#xff0c;特别是基于GPU加速的云平台&#xf…

【C语言】初阶数据结构相关习题(二)

&#x1f386;个人主页&#xff1a;夜晚中的人海 今日语录&#xff1a;知识是从刻苦劳动中得来的&#xff0c;任何成就都是刻苦劳动的结果。——宋庆龄 文章目录 &#x1f384;一、链表内指定区间翻转&#x1f389;二、从链表中删去总和值为零的节点&#x1f680;三、链表求和&…

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…

Element Plus 取消el-form-item点击触发组件,改为原生表单控件

文章目录 问题&#xff1a;方法一&#xff1a;使用全局样式覆盖&#xff08;推荐&#xff09;方法二&#xff1a;自定义指令&#xff08;更灵活&#xff09;方法三&#xff1a;封装高阶组件方法四&#xff1a;运行时DOM修改&#xff08;不推荐&#xff09; 问题&#xff1a; 描…

Git-学习笔记(粗略版)

前言 很多人都听过git&#xff0c;github这些名词,但是它们是什么&#xff0c;怎么使用&#xff1f;git和github是一个东西吗&#xff1f;本文将详细解答这些问题&#xff0c;彻底弄懂git。 1.Git是啥❓ 有一天&#xff0c;我们的插画师小王接到一个绘画订单&#xff0c;但奈…

专项智能练习(定义判断)

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff…

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error

Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考&#xff1a;https://www.bilibili.com/opus/977469285985157129 A9 - A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1 A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xf…

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …

【高频面试题】LRU缓存

文章目录 1 相关前置知识&#xff08;OS&#xff09;2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 &#xff08;双端队列哈希表&#xff09;思路 2.4 解法2思路 3 参考 1 相关前置知识&#xff08;OS&#xff09; 为什么需要页面置换算法&#xff1a;当进程运行时&…