给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:
我很怀疑这道题目是简单题,当我用dfs跑出结果发现超时了,我人都傻了,我的dfs代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
vector<vector<int>> res;
dfs(res, ans, nums, 0, 0, target);
return res[0];
}
void dfs(vector<vector<int>>& res,vector<int>& ans, vector<int> nums, int index, int num, int target){
if(target == 0 && num == 2){
res.push_back(ans);
return;
}
if(index == nums.size()){
return;
}
//不选择当前的数
dfs(res, ans, nums, index + 1, num, target);
//选择当前的数
if(abs(target - nums[index]) >= 0 && num < 2){
ans.push_back(index);
dfs(res, ans, nums, index + 1, num + 1, target - nums[index]);
ans.pop_back();
}
}
};
百思不得其解我又仔细审视了一下题目,既然只要两个数,不如暴力试试?果然成功,慢是慢了点,但是结果对鸭,代码如下,原来简单的意思是这个啊。。。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
int len = nums.size();
bool flag = false;
for(int i = 0 ; i < len; i ++){
for(int j = 0; j < len; j ++){
if(nums[i] + nums[j] == target && i != j){
ans.push_back(i);
ans.push_back(j);
flag = true;
break;
}
}
if(flag){
break;
}
}
return ans;
}
};