LeetCode 1. Two Sum ——哈希表、C++类及指向类成员函数指针

本文详细介绍了LeetCode 1号题的两种解法:双指针法和哈希表法。双指针法通过排序与遍历来寻找两数之和等于目标值的解;哈希表法则利用哈希表快速查找的特性实现高效求解。文章对比了两种方法的优劣,并总结了解题过程中的注意事项。

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

原题

LeetCode 1

题目大意及思路

  • 题目大意: 给了一个数组nums及一个数target,要求找出数组nums中两个元素,使得两个元素相加的和为target,按顺序存储两个元素的下标到动态数组中并返回该数组。
  • 思路:
    ①用结构体存储下数组的值以及坐标,放入动态数组v中。由于题中条件保证了只有一个解,那么不存在有解如:一个解元素m(数组nums中存在多个m),一个解元素n,因此不必担心重复元素的下标选择问题。
    ②将v排序,使用双指针思想,得到解。

代码

class Solution {
public:
    struct node{
    int value,index;
    };
    static bool cmp(node a,node b){
        return a.value<b.value;
    }
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<node> v;
        for(int i=0;i<nums.size();i++)   v.push_back({nums[i],i});
        sort(v.begin(),v.end(),cmp);
        int i=0,j=v.size()-1;
        vector<int> ans;
        while(i!=j){
            if(v[i].value+v[j].value==target){
                ans.push_back(v[i].index);
                ans.push_back(v[j].index);
                break;
            } 
            else if(v[i].value+v[j].value<target) i++;
            else j--;
        }
        return ans;
    }
};

运行截图

在这里插入图片描述

收获

  • 我的解法因为使用了结构体+动态数组,内存方面实在是不佳。看了官方解法:使用哈希表。
 class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};

思路为:在遍历每个元素的时候,就从哈希表就用迭代器和find()函数查找是否存在target - nums[i],若不存在,则在哈希表中记录下此时的映射关系(上面有解释过,不必担心有重复的元素时下标被覆盖,因为当有重复的元素时,要么有且只有两个重复元素即解,要么解中不会出现该重复元素),若存在,则可以返回答案,此时答案为{it->second, i}。(因为遍历是按照下标顺序来的,所以当迭代器找到时,找到的元素一定在目前i的前面,若在后面的话映射表还未存入)

  • 在解题过程中,我使用了cmp()函数,出现了如下错误:
    在这里插入图片描述之后了解到,在类中使用sort(v.begin(),v.end(),cmp)函数时,第三个参数其实是指向函数的指针,而这里cmp()是类成员函数,它的指针和普通函数指针不一样,具体介绍可以看这篇blog:指向类成员函数指针
    解决方法:在cmp()函数前加static;或者将cmp()函数移至类外。
    阅读: C++类C++类举例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值