[理解leetcode解法]1.TwoSum 两数之和

1.TwoSum 两数之和

题目忘记复制了 - -...

bool lessthan(const pair<int, int>& lhs, const pair<int, int>& rhs) {
    if (lhs.first == rhs.first)  
        return lhs.second < rhs.second;
    return lhs.first < rhs.first;
}     //1
class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<pair<int, int>> vnum;     //2
        for (size_t i = 0; i < numbers.size(); i++) {
            vnum.push_back(make_pair(numbers[i], i + 1));
        }
        sort(vnum.begin(), vnum.end(), lessthan);
        vector<int> ans;
        int s = 0, e = vnum.size() - 1;
        while (s < e) {   //3
            if (vnum[s].first + vnum[e].first == target) {
                ans.push_back(min(vnum[s].second, vnum[e].second));
                ans.push_back(max(vnum[s].second, vnum[e].second));
                break;
            }
            else if (vnum[s].first + vnum[e].first > target)
                e -= 1;
            else
                s += 1;
        }
        return ans;
    }
}; 
[理解leetcode解法]1.TwoSum 两数之和_第1张图片



//1:
vector第三个参数,lessthan函数,函数体内实现你想要排序的算法,这里是如果lhs的vnum的第一个元素(即value)小于rhs的vnum的第一个元素,那么则返回true,若第一个元素相同,则比较第二个元素(即位置数i)
//2:
vector,C++容器
(1)头文件#include<vector>
(2)创建vector<int> vec;
(3)尾部插入字:vec.push_back(a);
(4)使用下标访问元素
(5)使用迭代器访问元素
(6)插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a
(7)删除元素:vec.erase(vec.begin()+2);删除第3个元素
(8)向量大小:vec.size()
(9)清空:vec.clear()

vector算法(#include<algorithm>):
(1)reverse(vec.begin(),vec.end());
(2)sort(vec.begin(),vec.end(),lessthan);//默认升序

pair<int,int>
(1)当需要返回两个数的时候,就例如这个类里面的vnum,需要第一个元素value和第二个元素num位置
(2)make_pair跟赋值一样
//3
这个s++和e--的,只有在当一种解法的时候才可用,不然ans不按从小到大顺序排序。

你可能感兴趣的:(LeetCode)