随机练习题Leetcode(一)

本文介绍了三种不同的两数之和问题的算法解决方案,包括使用哈希表进行快速查找、针对已排序数组采用二分搜索法提高效率以及设计数据结构支持实时插入与查找操作。

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


1. Two Sum

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        multimap<int, int> map1;
        for (int i =0 ; i<nums.size(); i++)
            //map1[nums[i]]=i;
            map1.insert(std::pair<int,int>(nums[i],i));

        vector<int> ret;
        if(!map1.empty())
        {
            multimap<int, int>::iterator iter = map1.begin();
            for(; iter!=map1.end(); iter++)
            {
                int first = (*iter).first;
                multimap<int, int>::iterator iter2 = map1.find(target-first);
                if(iter2!=map1.end() && iter2!=iter)
                {
                    ret.push_back((*iter).second);
                    ret.push_back((*iter2).second);
                    break;
                }
            }
        }
        return ret;
    }
};
/*
注释:
1.所给序列可能有重复的元素
2.在查找时,需要保证查找到的不是同一个元素的迭代器
*/

167. Two Sum II - Input array is sorted

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> ret;
        for(int i = 0; i<numbers.size(); i++)
        {
            int first = numbers[i];
            int second = BinarySearch(numbers, i+1, numbers.size(), target-first);
            if(second!=-1 && second>i)
            {
                ret.push_back(i+1);
                ret.push_back(second+1);
                break;
            }
        }
        return ret;
    }
    int BinarySearch(vector<int> &num, int start, int end, int target)
    {
        while(start<=end)
        {
            int mid = start+(end-start)/2;
            if(target < num[mid])
                end = mid - 1;
            if(target > num[mid]) 
                start = mid + 1;
            if(target == num[mid])
                return mid;
            return BinarySearch(num, start, end, target);
        }
        return -1;
    }
};

170. Two Sum III - Data structure design

class TwoSum {
public:
    // Add the number to an internal data structure.
    void add(int number) {
        numbers[number]++;
    }

    // Find if there exists any pair of numbers which sum is equal to the value.
    bool find(int value) {
        for(auto iter: numbers)
        {
            if(numbers.find(value- iter.first)!=numbers.end())
            {
                if(value - iter.first == iter.first)
                {
                    if(iter.second>1)
                        return true;
                }
                else
                    return true;
            }
        }
        return false;
    }

private:
    //vector<int> numbers;
    unordered_map<int, int> numbers;
};

// Your TwoSum object will be instantiated and called as such:
// TwoSum twoSum;
// twoSum.add(number);
// twoSum.find(value);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值