美文网首页
1. 两数之和

1. 两数之和

作者: gykimo | 来源:发表于2021-08-05 09:43 被阅读0次

题目:https://leetcode-cn.com/problems/two-sum/
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

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

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

我的方法一:先排序后用双指针,O(nlogn),O(n)

开始并没有想到官方使用哈希表来O(1)查找,而是想先对nums进行排序,但是排序后一些元素的index和之前的index会不同,所以排序后的nums需要记录之前的index;
然后通过双指针,从排序后的nums左右开始找,将双指针对应的元素相加
如果等于target,那么返回对应排序前的index,注意还得将小的index在前,大的index在后;
如果大于target,那么左移右指针;
如果小于target,那么右移左指针;

这个方法并不好,所以没有实现。

我的方法二:O(n),O(n)

步骤

  1. 先将nums存到一个哈希表里,key是元素的值,value是对应的位置index;
  2. 从头开始遍历nums,先得到target-nums[index]的差,判断该差是否在哈希表里
  3. 如果不在,继续第2步;如果在那么说明找到了对应的对,结果的第一个元素就是遍历的index,第二个元素就是对应的哈希表的value;

复杂度

时间:O(N),遍历nums存到哈希表O(N),遍历nums从哈希表找对应的差值O(N),哈希表查找O(1),所以总体是O(N)
空间:O(N),使用了哈希表,存储了所有的nums元素

代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
        unordered_map<int, int> m; // key is nums item, value is nums index

        int size = nums.size();

        //时间O(N), 空间O(N)
        for(int i = 0; i< size; i++){
            m[nums[i]] = i;
        }

        int index = 0;
        int another = 0;
        unordered_map<int, int>::iterator iter;

        //时间O(N)
        while(index < size){
            another = target - nums[index];

            //时间O(1)
            iter = m.find(another);
            if(iter != m.end() && index != iter->second){
                ret.push_back(index);
                ret.push_back(iter->second);
                return ret;
            }
            index++;
        }

        return ret;
    }
};

相关文章

  • 1. 两数之和

    https://leetcode-cn.com/problems/two-sum/description/给定一个...

  • 1. 两数之和

    内容 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素...

  • 1. 两数之和

    20180919-摘抄自1. 两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每...

  • 1. 两数之和

    1、暴力法,求target-num[current]是否满足 2、哈希表

  • 1. 两数之和

    代码 分析 主要是利用map集合来存储值,存储的是下一下要找的值和当前的索引,然后找到的时候就可以知道这两个索引

  • 1. 两数之和

    一、题目原型: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同...

  • 1.两数之和

    题目: 给定一个整数数列,找出其中和为特定值的那两个数。 你可以假设每个输入都只会有一种答案,同样的元素不能被重用...

  • 1.两数之和

    leetcode算法学习,打算每日1篇 自己写的代码太low就不上了,主要是对最优代码的注释和自己的小小理解 题目...

  • 1. 两数之和

    LeetCode 的算法题 PHP解法记录 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假...

  • 1. 两数之和

    https://leetcode-cn.com/problems/two-sum/description/给定一个...

网友评论

      本文标题:1. 两数之和

      本文链接:https://www.haomeiwen.com/subject/ctbevltx.html