给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。除了哈希表以外的方法,c++
时间: 2024-09-09 10:07:36 浏览: 46
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
要解决这个问题,我们可以使用一种称为“双指针”的方法,这种方法特别适用于有序数组。但是,由于题目没有明确指出数组是否有序,我们可以先对数组进行排序,然后使用双指针进行查找。具体步骤如下:
1. 首先对数组进行排序。
2. 初始化两个指针,一个指向数组的开始位置(left),一个指向数组的结束位置(right)。
3. 计算两个指针指向的数之和sum。
4. 如果sum等于目标值target,则返回这两个数的原始索引。
5. 如果sum大于target,则将right向左移动一位(因为数组已排序,向左移动会减小sum的值)。
6. 如果sum小于target,则将left向右移动一位(同样,向右移动会增大sum的值)。
7. 重复步骤3-6,直到找到答案或者left和right相遇。
注意:由于数组会被排序,返回的索引需要根据原始数组的位置进行调整。可以通过记录每个数字在原数组中的索引来实现。
以下是使用C++实现的代码示例:
```cpp
#include <vector>
#include <algorithm>
#include <unordered_map>
std::vector<int> twoSum(const std::vector<int>& nums, int target) {
// 记录原始索引
std::unordered_map<int, int> index_map;
for (int i = 0; i < nums.size(); ++i) {
index_map[nums[i]] = i;
}
// 创建一个副本用于排序
std::vector<int> sorted_nums = nums;
std::sort(sorted_nums.begin(), sorted_nums.end());
int left = 0, right = nums.size() - 1;
while (left < right) {
int sum = sorted_nums[left] + sorted_nums[right];
if (sum == target) {
// 找到答案,返回原始索引
return {index_map[sorted_nums[left]], index_map[sorted_nums[right]]};
} else if (sum < target) {
++left;
} else {
--right;
}
}
return {}; // 如果没有找到答案,返回空数组
}
```
这段代码首先创建了一个哈希表来记录每个数字在原数组中的索引,然后对数组进行了排序,并使用双指针方法寻找目标值。
阅读全文