leetcode 1346. Check If N and Its Double Exist
方法一:
如果都是非负数的从小到大有序序列,从左往右i,j两个指针扫描,j为不满足2*a[i]<a[j]的下一个j。
排序O(nlogn),扫描O(n)
如果有正有负,分成两个序列,把负数序列反转、取相反数。
class Solution
{
public:
bool check_sorted(vector<int>& arr)
{
// sort(arr.begin(),arr.end());
int len=arr.size();
// cout<<"sorted array: ";
// for(int i=0;i<len;++i)
// cout<<arr[i]<<" ";
// cout<<endl;
int i=0;
int j=1;
while(i<len-1&&j<len)
{
int val_a=arr[i];
if(j<=i)
j=i+1;
if(j>len-1)
break;
while(arr[j]<val_a*2)
{
++j;
if(j>len-1)
break;
}
if(j>len-1)
break;
// cout<<"i: "<<i<<", j: "<<j<<endl;
if(val_a*2==arr[j])
return true;
++i;
}
return false;
}
bool checkIfExist(vector<int>& arr)
{
sort(arr.begin(),arr.end());
int len=arr.size();
// cout<<"sorted array: ";
// for(int i=0;i<len;++i)
// cout<<arr[i]<<" ";
// cout<<endl;
if(arr[0]>=0)
return check_sorted(arr);
int sign_change_i=-1;
for(int i=1;i<len;++i)
{
if(arr[i-1]*arr[i]<=0)
{
sign_change_i=i;
break;
}
}
if(sign_change_i==-1)
{
reverse(arr.begin(),arr.end());
return check_sorted(arr);
}
else
{
vector<int> vec_neg(arr.begin(),arr.begin()+sign_change_i);
vector<int> vec_pos(arr.begin()+sign_change_i,arr.end());
reverse(vec_neg.begin(),vec_neg.end());
int len_neg=vec_neg.size();
for(int i=0;i<len_neg;++i)
{
vec_neg[i]=-vec_neg[i];
}
bool res_neg=check_sorted(vec_neg);
bool res_pos=check_sorted(vec_pos);
return res_pos||res_neg;
}
}
};
方法二:hash set
哈希表每次查找O(1)时间
class Solution
{
public:
bool checkIfExist(vector<int>& arr)
{
unordered_set<int> visited_set;
for(vector<int>::iterator iter=arr.begin();iter!=arr.end();++iter)
{
int val=*iter;
if(val%2==0)
{
if(visited_set.find(val*2)!=visited_set.end()||visited_set.find(val/2)!=visited_set.end())
return true;
}
else
{
if(visited_set.find(val*2)!=visited_set.end())
return true;
}
visited_set.insert(val);
}
return false;
}
};