leetcode(easy)_1
程序员文章站
2022-07-15 12:46:09
...
题目描述
求数组内哪两个位置的数加起来等于给定和。
解答
1.暴力
双重循环遍历整个数组
2.哈希表
用哈希表将原来数组保存,然后再遍历数组,查找target-当前数的值是否在哈希表中。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> hash;
vector<int> a;
for (int i = 0; i < nums.size(); i++){
hash[nums[i]] = i;
}
for (int i = 0;i < nums.size(); i++){
if(hash.find(target - nums[i]) != hash.end())
{
if(i == hash[target-nums[i]])
continue;
a.push_back(i);
a.push_back(hash[target - nums[i]]);
break;
}
}
return a;
}
};
3.排序
先将数组从小到大排序,然后设置头尾两个指针,进行遍历。为了保留原始数组中数的下标,将之前的数组用结构体进行保存。
#include<cstdio>
#include<algorithm>
using namespace std;
struct p{
int value;
int index;
};
bool cmp(const p &a, const p &b){
return a.value < b.value;
}
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> a;
vector<p> tmp;
for(int i = 0; i < nums.size(); i++){
p t;
t.value = nums[i];
t.index = i;
tmp.push_back(t);
}
sort(tmp.begin(), tmp.end(), cmp);
int l = 0, r = tmp.size() - 1;
while(l < r)
{
if(tmp[l].x + tmp[r].x == target){
a.push_back(tmp[l].index);
a.push_back(tmp[r].index);
break;
}
else if(tmp[l].value + tmp[r].value < target){
l++;
}
else if(tmp[l].value + tmp[r].value > target){
r--;
}
}
return a;
}
};
推荐阅读
-
新变化一堆 Windows 10 19H1 18298抢先看
-
Windows 10 19H1新版18298推送:“爆炸式”海量功能
-
pow函数(数学次方)在c语言的用法,两种编写方法实例( 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)
-
Android 百度地图Sha1获取的方法
-
iPad mini 1和iPad mini 2有什么区别?买哪个比较好?
-
js延迟1秒的方法(javascript延时函数)
-
超精华的asp代码大全第1/2页
-
跟有结果的人学习《社群团购第1堂课》
-
马云称见好就收,张勇却说双11要达到1万亿,到底能不能实现?
-
解决C#连接Mongo报Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1错误