1521. 找到最接近目标值的函数值
最后更新于
最后更新于
https://leetcode-cn.com/problems/find-a-value-of-a-mysterious-function-closest-to-target/
位运算
动态规划
暂无
首先我们要知道一个前提,那就是对于一个数组 arr,对 arr 的子数组 arr[l:r] 进行与操作满足单调性,也就是说 arr[l:r] >= arr[l+1:r] >= arr[l+2:r] ... 。其中的依据是一个数异或另外一个数的结果一定不会比这两个数大。
为了更好的理解本题。我们可以从一个简单的例子入手。
题目描述:
一种思路是总的连续子数组个数等于:以索引为 0 结尾的子数组个数 + 以索引为 1 结尾的子数组个数 + … + 以索引为 n - 1 结尾的子数组个数,这无疑是完备的。
关于这点不熟悉的,也可以看下我的 【西法带你学算法】一次搞定前缀和
我们也可以采用同样的思路进行枚举。
总的连续子数组按位与操作等于:以索引为 0 结尾的子数组按位与操作的结果, 以索引为 1 结尾的子数组按位与操作的结果 + … + 以索引为 n - 1 结尾的子数组按位与操作的结果,这无疑是完备的。
而题目我求的不是总和,而是与 target 最接近的,不过这不难,使用一个全局变量记录即可。
以索引为 i 结尾的子数组按位与操作的结果 sub[i] 其实就等于 sub[i-1] & A[i]
。这提示我们使用滚动数组来完成。而由于重复数字是没有意义的,因此可使用 hashset 来优化,而不是普通的数组,这样可以同时降低时间和空间复杂度。
关于滚动数组可以参考我之前写的动态规划章节
这种解法其实就是暴力求解,和动态规划没有啥区别。
识别出函数 func 满足某种单调性
采用合适的枚举方法
代码支持:Python3
复杂度分析 令 N 为数组长度, C 为 seen 的大小。C 的大小和数据范围有关,在这里 C 不会超过 32。
时间复杂度:$O(N*C)$
空间复杂度:$O(C)$
更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。