Leetcode系列(#1 Tow Sum)

来源:互联网 发布:融资融券的数据怎样看 编辑:程序博客网 时间:2024/06/07 23:27

**

Leetcode系列(#1 Tow Sum)

**

初次开始写leetcode的代码,自己完全不是什么大神,只是希望通过这种每天记录的方式,把自己学到的东西写一写,促进自己学习,同时也发出来求大家指正,相互学习!
LeetCode的第一题就是Tow Sum,虽然标记是medium的难度,但是还算是比较容易。
原题截图
题目大意就是输入一个数组和目标(target),在数组中找到两个相加等于这个target的数,并且返回他们的下标。比如输入numbers={2,7,11,15}, target=9,则输出下标1,2(这里已经设置下标从1开始,而不是从0开始)
有两种方法可以解决这个问题。
第一种是最直接的方法:对数组排序的方法

vector<int> twoSum(vector<int>& nums, int target) {    int a=0;    int n=nums.size();    int b=n-1;    vector<int> numbers=nums;    vector<int> result;    sort(numbers.begin(),numbers.end());    while (a<n) {        if (numbers[a]+numbers[b]>target) b--;        else if(numbers[a]+numbers[b]<target) a++;        else break;    }    for (int i=0; i<n; ++i) {        if (nums[i]==numbers[a]) result.push_back(i+1);        else if(nums[i]==numbers[b]) result.push_back(i+1);    }    if (result[0]>result[1]) swap(result[0], result[1]);    return result;}

这种方法比较直观,现排序,然后对两个下标调整。算法复杂度为O(n*log n).

第二种方法是用map的方法:

vector<int> twoSum(vector<int>& nums, int target) {    map<int,int> M;    for (int i=0;i<nums.size(); i++) {        if(M.find(target-nums[i])!=M.end())            return {M[target-nums[i]]+1, i+1};        M[nums[i]]=i;    }    return {0};}

这是利用了map的方法,把数组的值作为key,数组的下标作为value,通过find()来找到相应的值。算法复杂度为O(n)。

补充几个关于map的相关知识点:
map是C++中的一个标准容器,它提供了一一对应的关系。
1.map的构造

map <int,int> M;map<int,string> M;

2.map的插入

M.insert(123,234);M.insert(123,"hello world");M[index]=value;

3.map的查找
M.find();
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
example:

if(M.find(nums[i])!=M.end())

find() 函数没有找到的话即返回end()。

1 0
原创粉丝点击