LeetCode第一题:两数之和(two sum)C++实现

说来惭愧。当时本科开始的时候,我偶尔还会刷刷acm,后来确定保研了,代码都不咋写了,目前码代码很生疏了,现在满心的后悔(当然世界上没有后悔药可以买/(ㄒoㄒ)/~~),我可不是替我的菜找借口啊
下面进入正题,开始我最直接的解题思路是这样的:首先对数组的元素进行排序,并且得到排序后各个元素的原来索引,(也就是元素大小在进行排序的过程中位置发生改变,索引是原来的索引值,但是位置也相应变化),那么这样就只要在数组中搜索小于target的前n个元素,对这些进行暴力遍历即可。后来想了一想,还不如直接暴力法呢,排序干嘛,我总是想的好复杂啊(就是自己太弱鸡了)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> index;
        vector<int> res;
        int length = nums.size();
        int num_size = nums.size();


        for(int i=0; i<num_size; i++) {
            index.push_back(i+1);
        }

        for(int j=0; j<num_size; j++) {
            for(int k=0; k<num_size-j-1; k++) {
                if(nums[k] > nums[k+1]) {
                    int temp = nums[k];
                    nums[k] = nums[k+1];
                    nums[k+1] = temp;

                    int temp_index = index[k];
                    index[k] = index[k+1];
                    index[k+1] = temp_index;
                }
            }
        }

        for(int m=0; m<num_size; m++) {
            if(target >= *max_element(nums.begin(), nums.end())) {
                length = num_size;
            }
            else if(target < nums[m]) {
                length = m+1;
                break;
            }
        }

        for(int n=0; n<length; n++) {
            for(int p=n+1; p<length; p++) {
                if(nums[n]+nums[p] == target) {
                    res.push_back(index[n]);
                    res.push_back(index[p]);
                    sort(res.begin(), res.end());

                    return res;
                }
            }
        }
    }

};

接下来是官方的解题方法:

//方法二 C++版本的两遍哈希表(官方题解)
/*
通过以空间换取速度的方式,我们可以将查找时间从 O(n) 降低到 O(1)。
C++版本的哈希表算法采用unordered_map。
*/
vector<int> twoSum(vector<int>& nums, int target) {
    vector<int> ans;
    unordered_map<int,int> tmpmap;
    int length = nums.size();
    for(int i = 0;i < length;i++){
        tmpmap[nums[i]] = i;
    }
    for (int i = 0; i < length; i++){
        if(tmpmap.count(target - nums[i]) != 0 && tmpmap[target - nums[i]] != i){  
        //使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。
            ans.push_back(i);
            ans.push_back(tmpmap[target - nums[i]]);
            break;
        }
    }
    return ans;
}

//方法三 C++版本的一遍哈希表(官方题解)
/*
事实证明,我们可以一次完成。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查
表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
*/
vector<int> twoSum(vector<int>& nums, int target) {
    vector<int> ans;
    unordered_map<int,int> tmpmap;
    int length = nums.size();
    for (int i = 0; i < length; i++){
        if(tmpmap.count(nums[i]) != 0){
            ans.push_back(tmpmap[nums[i]]);
            ans.push_back(i);
            break;
        }
        tmpmap[target - nums[i]] = i;
    }
    return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值