Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
大致意思:
给定一个整数数组,返回两个数字的索引,使它们相加到特定目标数值。
您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
class Solution {
public:
vector twoSum(vector& nums, int target) {
int size = nums.size();
vectorresult;
for(int i = 0; i < size - 1; i++) {
for(int j = i+1; j < size; j++){
if (nums[i] + nums[j] == target) {
result.push_back(i);
result.push_back(j);
return result;
}
}
}
}
};
第一次在LeetCode上做算法题,重拾了很久没接触过的代码,采用了暴力解法
思路:暴力求解,直接遍历vector中的值进行相加求和
注意:暴力求解可能会遇到两个坑
1、对 j 的取值范围不清,j = i导致可能会在同一个数上进行求和
2、同上,j = 0可能会在开头就满足了两数相同但是和可以得到target
PS: 看到solution之后惊了,原来算法要考虑复杂度的问题,貌似暴力遍历的话时间复杂度是O(n^2)
solution基本都是用哈希表方式解决,遍历列表中的n个元素只需要一次
solution(Java):
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}