一开始用了两个For 循环写的,看了官方的解决方案发现复杂度太高,时间复杂度为O(N2)。
然后发现用Hashmap更加简单一点:
JAVA:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for (int i=0;i<nums.length;i++){
int complement= target-nums[i];
if(map.containsKey(complement)){
return new int[] {map.get(complement),i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
Map<Integer,Integer> map=new HashMap<>();
for (int i=0;i<nums.length;i++){
int complement= target-nums[i];
if(map.containsKey(complement)){
return new int[] {map.get(complement),i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
先是求target减去第i个数字还需要多少,然后如果它在map里就返回它和i的下标
如果不存在,就把它和下标存进map。
例:
【2,9,11,15】target=13
i=0; nums[i]=2; complement=13-2=11;不在;把2,0存进map
i=1;nums[i]=9;complement=13-9=4;map:2 不在;把9,1存进map
i=2;nums[i]=11;complement=13-11=2;map:2,9 在; 返回下标0,2。
Python:
python里的字典就像java里的HashMap,以键值对的方式存在并操作
class Solution:
def twoSum(self, nums, target):
map={}
r=[]
for i in range(0,len(nums)):
complement=target-nums[i]
if complement in map:
#print(complement)
r.append(map[complement])
r.append(i)
return r
else :
map[nums[i]]=i
def twoSum(self, nums, target):
map={}
r=[]
for i in range(0,len(nums)):
complement=target-nums[i]
if complement in map:
#print(complement)
r.append(map[complement])
r.append(i)
return r
else :
map[nums[i]]=i
哈哈哈 折腾了好久 不过总算是弄出来了
犯了个小错误 把增加map字典写成了map={nums[i]:i},所以每次map都在刷新而不是新增一个
蠢蠢的