• Leetcode1521 找到最接近目标的函数值 位运算


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

    题意

    给定(n)个数,目标数(target),求区间([l,r])(a_l & a_{l+1} & ...a_{r-1}&a_r = f),(|f - target|)的最小值

    [1 leq n leq 10^5\ 1 leq a_i leq 1e9\ 0 leq target leq 1e7 ]

    分析

    显然线段树或者ST表二分可做。

    但是此题也可利用与运算的性质:

    注意如果固定(r),那么枚举(l),最多会产生(20)(f),这是因为与运算使其单调递减,且每次变化会至少少一个(1),那么只需要动态维护这个集合,从(r),到(r+1)的过程,只需要让(a_{r+1})和集合中的数做与运算即可,同时维护最小值。

    用vector表示集合复杂度(O(nlogn)),set维护起来方便,复杂度(O(nlognlog(logn)))

    代码

    class Solution {
    public:
        int closestToTarget(vector<int>& arr, int target) {
            set<int> st;
            int ans = 1e9;
            for(int i = 0;i < arr.size();i++){
                for(auto it:st){
                    ans = min(ans,abs(target - (arr[i] & it)));
                }
                set<int> Newst;
                for(auto it:st){
                    Newst.insert(arr[i] & it);
                }
                Newst.insert(arr[i]);
                ans = min(ans,abs(target - arr[i]));
                st = Newst;
            }
            return ans;
        }
    };
    
  • 相关阅读:
    python RabbitMQ队列/redis
    python 协程
    Python 线程
    Python Socket网络编程
    Python 面向对象编程进阶
    Python 面向对象
    python 模块
    Python 迭代器&生成器&装饰器
    Python 集合操作
    Java多态--构造方法的内部方法多态
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14485709.html
Copyright © 2020-2023  润新知