题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
暴力法
复杂度分析
时间复杂度:O(n ^2 )
空间复杂度:O(1)
c++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(nums[i]==target-nums[j]){
return {i,j};
}
}
}
return {};
}
};
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(nums[i]+nums[j]==target){
return new int[] { i, j };
}
}
}
return new int[] {};
}
}
python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
lens = len(nums)
for i in range(0,lens):
for j in range(i+1,lens) :
if(target==nums[i]+nums[j]):
return [i,j]
return []
JavaScript
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let len = nums.length;
for(let i=0;i<len;i++){
for(let j=i+1;j<len;j++){
if(target==nums[i]+nums[j]){
return [i,j];
}
}
}
return {};
};
golang
func twoSum(nums []int, target int) []int {
for i,vi := range nums {
for j, vj:=range nums[i+1:] {
if target == vi+vj {
return []int{i,j+i+1}
}
}
}
return []int{}
}
一次哈希遍历
复杂度分析
时间复杂度:O(n )
空间复杂度:O(n):需要的额外空间根据所求置变化。
c++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
if(m.find(target-nums[i])!=m.end())//m中存在对应的键值
return {m[target-nums[i]],i};//因为i为较大的元素,此时添加进去的键值都还小于i,所以i在后面
m[nums[i]]=i; //向map中添加元素
}
return {};
}
};
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < len; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
return new int[] {};
}
}
python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashMap = {}
lens = len(nums)
for i,num in enumerate(nums):
if hashMap.get(target - num) is not None:
return [hashMap.get(target - num),i]
hashMap[num] = i
return []
Golang
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i := 0; i < len(nums); i++ {
num := target - nums[i]
ix, ok := m[num]
if ok != false {
return []int{ix, i}
}
m[nums[i]] = i
}
return []int{-1,-1}
}
执行用时 :4 ms, 在所有 Go 提交中击败了96.85%的用户
内存消耗 :3.8 MB, 在所有 Go 提交中击败了23.03%的用户