1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题比较简单,一开想到的肯定就是暴力破解,也就是两次循环,一个个的找。
当时想到是不是大于target的值可以过滤掉,后来发现,只说了整数,没有说是正数,所以不能过滤。
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; for(int i = 0; i < nums.size(); i++) { //这里要留意,写成i++会修改i的值,导致越界 for(int j = i + 1; j < nums.size(); j++) { if(nums[i] + nums[j] == target) { ret.emplace_back(j); ret.emplace_back(i); break; } } if(!ret.empty()) { break; } } return ret; } };
另一种方法,就是空间换时间。把原来遍历过的数据保存,读取到新的数据的时候,从老的数据中寻找,有没有相加得target的信息。有的话,把两个索引输出。
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; unordered_map<int, int> numindex;//first num, second index for(int i = 0; i < nums.size(); i++) { if(numindex.count(nums[i]) == 0) { numindex[nums[i]] = i; } if(numindex.count(target - nums[i]) > 0) { //这里的判断要注意,是遇到相同数据的case时出现的错误,比如[3,3],target是6 if(numindex[target - nums[i]] != i) { ret.emplace_back(i); ret.emplace_back(numindex[target - nums[i]]); break; } } } return ret; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏