给定未排序数组(可能有重复元素),找出和为给定值的所有二元组元素的下标

题目

给定一个未排序数组(可能有重复元素),找出和为给定值的所有二元组元素的下标
例如:数组{2, 1, 2,3, 4, 0 }, target = 5
答案:{{0, 3},{ 2, 3}, {1,4} }
要求,时间复杂度为O(n),空间复杂度O(n)

思路

网上类似的题目是已排序的数组,通过双指针就可以解决,空间复杂度可以控制在O(1),而未排序的数组需要保存已遍历元素的信息,可以考虑使用map进行存储,这样每次查询的时候时间复杂度可以控制在O(1)

使用unordered_map<int, vector> m 进行已遍历元素的存储,key 值为已遍历数组元素值value值为该元素出现的下标次数因为有重复元素,用vector存储下标)。

遍历到第i个元素**nums[i]的时候,查询target-nums[i]**是否已出现,出现则说明该可以组成题目要求的二元组

遍历n个元素,时间复杂度为O(n)

实现

void findpair(vector<int> & nums, int target)
{
    unordered_map<int, vector<int>> m;
    int n = nums.size();
    for(int i = 0; i<n; ++i) {
        int sub = target - nums[i];
        if(m.count(sub) > 0) {
            for(auto iter : m[sub]) {
                cout<<iter << " "<< i<< endl;
            }
        }
        if(m.count(nums[i]) == 0) {
            m.insert(pair<int, vector<int>> (nums[i], {i}));
        }else
            m[nums[i]].push_back(i);
    }
}

int main()
{
    vector<int> nums = {2, 1, 2, 3, 3, 5, 0};
    int target = 5;

    findpair(nums, target);

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值