首页 > 其他分享 >两数之和-双指针+哈希表

两数之和-双指针+哈希表

时间:2023-02-03 15:47:16浏览次数:49  
标签:end target temp nums int vector 哈希 两数 指针

链接:两数之和

题目描述

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

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

你可以按任意顺序返回答案。
示例:
输入:nums = [3,2,4], target = 6
输出:[1,2]

题解1

这是本人做题时想到的方法,由于题给数组是无序的,因此先进行排序,之后根据有序数列的性质进行简化
sort(a), 令i = 0, j = len(a)
1、如果a[i] + a[j] == target,记录下标,break
2、如果a[i] + a[j] < target, 则i++
3、如果a[i] + a[j] > target ,则j--

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        int len = nums.size();
        vector<int> ans;
        vector<int> temp = nums;
        sort(nums.begin(), nums.end());
        int i = 0, j = len - 1;
        while(i < j)
        {
            if(nums[i] + nums[j] == target)
            {
                auto loc1 = find(temp.begin(), temp.end(), nums[i]) ;
                auto loc2 = find(temp.begin(), temp.end(), nums[j]) ;
                if(loc1 == loc2 && loc1 != temp.end())
                    loc2 = find(loc1 + 1, temp.end(), nums[j]);
                ans.push_back(loc1 - temp.begin()), ans.push_back(loc2 - temp.begin());
                break;        
            }
            else if(nums[i] + nums[j] < target)
                i++;
            else
                j--;
            
        }
        return ans;
    }
};

时间复杂度O(nlogn),空间复杂度O(n)

题解二

这是leetcode官方提供的解法

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

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

当遍历到某一元素x时,需要寻找的元素为target-x,而要被寻找的元素在之前可能出现过,而查找某一元素是否出现过,直观想法就是利用hashTable

标签:end,target,temp,nums,int,vector,哈希,两数,指针
From: https://www.cnblogs.com/parallel-138/p/17089414.html

相关文章

  • C++ 哈希表查询_进入哈希函数结界的世界
    1.前言哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行API定制,对于大部分高级语言......
  • 指针题2
    intmain(){inta[5][5];//5行5列的整型数组//00010203041011121314202122232430313233344041424344//||......
  • 前缀和-差分-双指针(下)
    双指针一般解决分段的问题,即求某一段的数据的值i为指针起点,j为指针终点一种是滑动窗口,i,j一定方向相同一种是夹逼,i,j相向配合前缀和使用a[i]+....a[j]=s[j]-s[i-1]......
  • #yyds干货盘点# LeetCode面试题:两数相加
    1.简述:给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • C++之智能指针
    一、为什么需要智能指针?如果在div()输入的b==0,那么就会抛出一个异常,被main()捕获,但是在Func()中new申请的资源就会因没释放而发生泄露问题,这是一种异常安全问......
  • c语言-----指针例子
    指针的基本应用#include<stdio.h>intmain(){ inta=100,b=200; int*p_1,*p_2=&b; p_1=&a; printf("a=%d\n",a); printf("*p_1=%d\n",*p_1); printf("b=%d......
  • 函数指针实现加法操作
    1doubleadd(doublex,doubley)2{3returnx+y;4}56//double(*Calulate)(double,double);//声明一个函数指针789doubleCalulate(do......
  • 指针(涉及一些底层知识)
    指针1.指针种类*一维指针**(multiply)二维或多维指针[*]指针数组(*)[]数组指针lpfn函数指针void*指针函数2.一维指针2.1概念​ 用来存放内存地址的变量......
  • #yyds干货盘点# LeetCode面试题:两数之和
    1.简述:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个......
  • 动态数组以及指针迭代器
    1#include<vector>//动态数组2#include<iostream>3usingnamespacestd;4vector<int>vec;//定义5intmain(){6intn;7cin>>n;8......