01 力扣热题刷题记录之第1题两数之和

力扣热题刷题记录之第1题两数之和

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

我的思路

首先想到的就是使用sort函数进行排序(可能脑抽了),然后用一次循环就可以找到两个数的下标,然后天真的输出了。

但是,排序后的数组下标已经发生了变化,这个时候咋办?

嘿嘿,复制一份原有的数组可还行,然后找到数在原有数组里头的下标,开干!!

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        //思路,空间换时间,先复制一份,然后排序,然后找到数在原始数组中的位置,
        //复杂度是sort函数的复杂度
        vector<int> nums1;
        for(int y=0;y<nums.size();y++)
        {
            nums1.push_back(nums[y]);
        }         
        sort(nums1.begin(),nums1.end()); //默认从小到大排序
        vector<int> xiaBiao;
        int i=0;
        int j=nums1.size()-1;
        for(;i<j;)
        {
            if(nums1[i]+nums1[j]==target)
            {
                
                break;
            }
            else if(nums1[i]+nums1[j]>target)
            {
                j--;
            }
            else 
            {
                i++;
            }              
        }
        bool flagx=true;
        bool flagy=true;
        for(int x=0;x<nums.size();x++)
        {
            if(nums[x]==nums1[i]&&flagx==true)
            {
                xiaBiao.push_back(x);
                flagx=false;
            }             
            else if(nums[x]==nums1[j]&&flagy==true)
            {
                xiaBiao.push_back(x);
                flagy=false;
            }
        }
        return xiaBiao;
    }
};

额,通过是没问题的,时间8ms,内存10.4MB,但是吧,总感觉走了弯路,看看官方的题解!

力扣官方给的思路

很容易想到用两个循环暴力求解,但是复杂度太多了,优化一下,这个时候官方提供一个思路,就是第二层循环找到target-x,这用了o(n),有没有办法优化一下呢?

想到了map,使用键值对,记录下来,查找就从o(n)变为了 o(1),nice!!

官方的代码:

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 {};
    }
};

官方的果然简洁得多的多啊!!

注意的细节

1、暴力求解当中,如果寻找target-x,那么由于x之前的数据已经和x匹配过了,那么直接就从x+1开始匹配。

2、hash表里面,记录taget-x的下标,如果target-x就是x自己的话,那么这个索引就是重复,这个时候要先判断target-x在不在hash表里面,再存入。

比如目标数字是6,这个时候索引x对应的数字是3,要找的另一个数字也是3,如果先存了索引x的这个数字,再去找目标数字3,这个时候返回的目标数字的3就和索引x的数字3下标一样了。所以得先查找,再存入。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值