leetcode 1346. Check If N and Its Double Exist 排序,双指针扫描,注意正负;哈希表

本文介绍了解决LeetCode 1346题目的两种方法:一种是通过排序和双指针技术检查序列中是否存在元素的两倍;另一种是使用哈希集合进行快速查找。适用于非负数和包含正负数的序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值