// 暴力
class Solution {
public:
int closestToTarget(vector<int>& arr, int target) {
int res=INT_MAX;
for(int i=0;i<arr.size();i++){
for(int j=i;j<arr.size();j++){
int ans=arr[i];
for(int k=i+1;k<=j;k++)
ans=ans & arr[k];
// cout<<ans<<endl;
res=min(res,abs(ans-target));
}
}
return res;
}
};
// 位运算
class Solution {
public:
int closestToTarget(vector<int>& arr, int target) {
int res=INT_MAX;
int add=arr[0];
vector<int> mem;
for(int i=0;i<arr.size();i++){
mem.push_back(arr[i]);
for(int j=0;j<mem.size();j++){
mem[j]=mem[j] &arr[i];
res=min(res,abs(mem[j]-target));
}
// add=add & arr[i];
// cout<<add<<endl;
}
return res;
}
};
class Solution {
public:
int closestToTarget(vector<int>& arr, int target) {
int res=INT_MAX;
int add=arr[0];
vector<int> mem;
for(int i=0;i<arr.size();i++){
mem.push_back(arr[i]);
for(int j=0;j<mem.size();j++){
mem[j]=mem[j] &arr[i];
res=min(res,abs(mem[j]-target));
}
set<int>s(mem.begin(), mem.end());
mem.assign(s.begin(), s.end());
}
return res;
}
};
// 线段树+ 滑动窗口
class Solution {
public:
vector<int> tree;
vector<int> data;
int closestToTarget(vector<int>& arr, int target) {
int n=arr.size();
data.resize(n);
for( int i=0;i<n;i++){
data[i]=arr[i];
}
tree.resize(4*n);
buildTree(1,0,n-1);
// for(int i=1;i<4*n;i++) cout<<tree[i]<<endl;
int l=0;
int r=0;
int ans=INT_MAX;
while(r<n){
int t=query(l,r);
if(t<target)
r=max(++l,r); //左边界右移
else
r++; //右边界右移
ans=min(ans,abs(t-target)); //更新结果
}
// cout<<query(1,1)<<endl;
return ans;
}
void buildTree(int treeindex,int l,int r){
if(l==r) {
tree[treeindex]=data[l];
return;
}
int mid=l+(r-l)/2;
buildTree(2*treeindex,l,mid);
buildTree(2*treeindex+1,mid+1,r);
tree[treeindex]=tree[treeindex*2]& tree[treeindex*2+1];
}
int query(int queryL,int queryR){
return _query(1,0,data.size()-1,queryL,queryR);
}
int _query(int treeindex,int l,int r, int queryL,int queryR){
if(l==queryL && r==queryR) return tree[treeindex];
int mid=l+(r-l)/2;
// cout<<treeindex<<endl;
if(queryL>=l&& queryR<=mid){
return _query(treeindex*2,l,mid,queryL,queryR);
}
else if(queryL>mid&& queryR<=r)
return _query(2*treeindex+1,mid+1,r,queryL,queryR);
return _query(2*treeindex,l,mid,queryL,mid)& _query(2*treeindex+1,mid+1,r,mid+1,queryR);
}
};
1521. 找到最接近目标值的函数值(位运算、线段树、滑动窗口)
猜你喜欢
转载自blog.csdn.net/qq_38662930/article/details/107542292
今日推荐
周排行