两数之和
题目
https://leetcode-cn.com/problems/two-sum/
问题重述
给定一个整数数组nums
和一个整数目标值target
,在该数组中找出和为目标值target
的那两个整数,并返回它们的数组下标。只有一个答案
题目分析
题目说只有唯一确定的解(你可以假设每种输入只会对应一个答案
),又能按区间将数组排序,所以想到了双指针。
解题思路
有三种思路,分别是:暴力、双指针、哈希表
先说暴力,双重循环,找到答案后结束。这样写的时间复杂度很高。
再说双指针做法:先将数组按非递减的顺序排好序,左右指针向中间靠拢,当两个指针指向的数字之和等于target
时返回结果;大于target
时右指针左移;小于target
时左指针右移。
最后说下哈希表,我们的目的是找到数组中存在的两个目标元素。每次访问到一个数时查询之前有没有出现过,有的话返回下标,没有的话将加入哈希表。
代码 只含核心代码
暴力
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i, j;
//双重循环
for(i = 0; i < nums.size(); ++i){
for(int j = i + 1; j < nums.size(); ++j){
if(nums[i] + nums[j] == target)
return {i, j};
}
}
return {-1, -1};
}
};
双指针 用双指针的前提是有序,一定不能忘记排序
class Solution {
public:
vector<int> twoSum(vector<int>& num, int target) {
//新开一个数组复制原数组 新数组排序后打乱下标,原数组提供下标
vector<int>nums = num;
//排序
sort(nums.begin(), nums.end());
int n = nums.size();
//左右双指针
int i = 0, j = n - 1;
int sum ;
while(i < j)
{
sum = nums[i] + nums[j];
//满足条件
if(sum == target)
{
i = nums[i];
j = nums[j];
break;
}
//之和小于目标值,让左指针右移
if(sum < target) ++ i;
//之和大于目标值,让右指针左移
else -- j;
}
if(i > j) swap(i, j);
vector<int> ans(2, -1);
//用的很笨的方法在原数组里面查询下标
for(int k = 0; k < n; ++ k)
{
if(num[k] == i)
{
ans[0] = k;
break;
}
}
for(int k = 0; k < n; ++ k)
{
if(k == ans[0]) continue;
if(num[k] == j)
{
ans[1] = k;
break;
}
}
return ans;
}
};
哈希表
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int>m;
for(int i = 0; i < nums.size(); ++ i)
{
auto it = m.find(target - nums[i]);
//在哈希表里找到了目标值
if(it != m.end())
{
return {i, it->second};
}
m[nums[i]] = i;
}
return {};
}
};
小结
这是很多人接触力扣的第一题。愿大家满怀热爱、一往无前。
附一张我的提交记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现