想法:
1.哈希表hashmap
第一种方法:将数组中元素及其下标right都加入hashmap中,对于每个元素n下标left,在map中查找是否有target-n的元素,若有,则返回其下标right
第二种方法:从第一个元素x下标left开始,若哈希表中无target-x的元素,则将key-x,value-left的键值对放入hashmap中,直至left=数组nums的长度-1;期间若找到元素,则返回left和right。
官方代码:
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); 4 for (int i = 0; i < nums.length; ++i) { 5 if (hashtable.containsKey(target - nums[i])) { 6 return new int[]{hashtable.get(target - nums[i]), i}; 7 } 8 hashtable.put(nums[i], i); 9 } 10 return new int[0]; 11 } 12 } 13 14 15 作者:LeetCode-Solution 16 链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/ 17 来源:力扣(LeetCode) 18 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我写的:
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); 4 int x = 0; 5 //从第一个元素x下标i开始 6 for(int i = 0;i<nums.length;i++){ 7 //直至left=数组nums的长度-1 8 x = target-nums[i]; 9 if(hashtable.containsKey(x)){ 10 //若哈希表中无target-x的元素,则将key-x,value-left的键值对放入hashmap中 11 return new int[]{hashtable.get(x), i}; 12 //期间若找到元素,则返回left和right。 13 }else{ 14 hashtable.put(nums[i],i); 15 } 16 } 17 return new int[0]; 18 } 19 }
2.暴力流:
下标left和right,当left为空,不断移动right,找到两个下标对应元素相加为target,返回这两个下标。复杂度n²