前言
本文是leetcode 第一题两数之和c++解法
一、两数之和题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]
二、解题
1.c++暴力法解决
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include<iostream> #include<vector> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i, j; for (i = 0; i < nums.size(); i++) { for (j = i + 1; j < nums.size();j++) { if (nums[i] + nums[j] == target) return { i,j }; } } return { i,j }; }
};
int main() { vector<int> twoSum = { 2, 7, 11, 15 }; int n = 9; vector <int> k; Solution x; k = x.twoSum(twoSum, n); for (int i = 0; i <= 1; i++) { cout << k[i]; } return 0; }
|
注意这里的解题过程是在编译器中的运行代码,来leetcode上提交只需要提交solution类即可。
注:vector是c++容器,某种意义上可以当作数组来用
2.两遍哈希表
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<iostream> #include<vector> #include<map> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> a; int r1, r2; for (int i = 0; i < nums.size(); i++) a.insert(map<int, int>::value_type(nums[i], i)); for (int i = 0; i < nums.size(); i++) { if (a.count(target - nums[i]) > 0 && (a[target - nums[i]] != i)) { r1 = i; r2 = a[target - nums[i]]; break; } } return { r1,r2 }; }
};
int main() { vector<int> twoSum = { 2, 7, 11, 15 }; int n = 9; vector <int> k; Solution x; k = x.twoSum(twoSum, n); for (int i = 0; i <= 1; i++) { cout << k[i]; } return 0; }
|
1.map是STL的一个关联容器,它提供一对一的hash。具体用法,可以看看这https://blog.csdn.net/sevenjoin/article/details/81943864
2.文中有关迭代器的知识自寻
3.一遍哈希表
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<iostream> #include<vector> #include<map> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> a; int r1, r2;
for (int i = 0; i < nums.size(); i++) { if (a.count(target - nums[i]) > 0 && (a[target - nums[i]] != i)) { r1 = a[target - nums[i]]; r2 = i; break; } a[nums[i]] = i; } return { r1,r2 }; }
};
int main() { vector<int> twoSum = { 2, 7, 11, 15 }; int n = 9; vector <int> k; Solution x; k = x.twoSum(twoSum, n); for (int i = 0; i <= 1; i++) { cout << k[i]; } return 0; }
|
该方法在使用迭代方法,在两遍哈希表的基础上再次优化
总结
这道题学习算法还在其次,主要是学会了如何使用leetcode,并成功提交了第一题,记录一下进步。