Java 方法1 AC
public class Solution { public int[] twoSum(int[] numbers, int target) { int len = numbers.length; Map<Integer,List<Integer>> numMap = new HashMap<Integer,List<Integer>>(); List<Integer> indexList = new ArrayList<Integer>(); for(int i = 0; i < len; i++){ indexList = numMap.get(numbers[i]); if(indexList == null){ indexList = new ArrayList<Integer>(); } indexList.add(i); numMap.put(numbers[i],indexList); } Arrays.sort(numbers); int []array = new int[2]; int low = 0; int high = len-1; while(low < high){ if(numbers[low] + numbers[high] > target){ high--; }else if(numbers[low] + numbers[high] < target){ low++; }else{ break; } } if(numbers[low] == numbers[high]){ indexList = numMap.get(numbers[low]); array[0] = indexList.get(0) + 1; array[1] = indexList.get(1) + 1; }else{ array[0] = numMap.get(numbers[low]).get(0) + 1; array[1] = numMap.get(numbers[high]).get(0) + 1; } Arrays.sort(array); return array; } }Java 方法2 排序 AC
public class Solution { public int[] twoSum(int[] numbers, int target) { int len = numbers.length; Map<Integer,List<Integer>> numMap = new HashMap<Integer,List<Integer>>(); List<Integer> indexList = new ArrayList<Integer>(); for(int i = 0; i < len; i++){ indexList = numMap.get(numbers[i]); if(indexList == null){ indexList = new ArrayList<Integer>(); } indexList.add(i); numMap.put(numbers[i],indexList); } Arrays.sort(numbers); int []array = new int[2]; for(int i = 0; i < len; i++){ int result = target - numbers[i]; if(numMap.containsKey(result)){ if (result == numbers[i]) { List<Integer> keyList = numMap.get(numbers[i]); array[0] = keyList.get(0)+1; array[1] = keyList.get(1)+1; }else { array[0] = numMap.get(numbers[i]).get(0)+1; array[1] = numMap.get(result).get(0)+1 ; } break; } } Arrays.sort(array); return array; } }Java 方法2 不排序 AC
public class Solution { public int[] twoSum(int[] numbers, int target) { int len = numbers.length; Map<Integer,List<Integer>> numMap = new HashMap<Integer,List<Integer>>(); List<Integer> indexList = new ArrayList<Integer>(); for(int i = 0; i < len; i++){ indexList = numMap.get(numbers[i]); if(indexList == null){ indexList = new ArrayList<Integer>(); } indexList.add(i); numMap.put(numbers[i],indexList); } int []array = new int[2]; for(int i = 0; i < len; i++){ int result = target - numbers[i]; if(numMap.containsKey(result)){ if (result == numbers[i]) { List<Integer> keyList = numMap.get(numbers[i]); if(keyList.size() == 1){ continue; } array[0] = keyList.get(0)+1; array[1] = keyList.get(1)+1; }else { array[0] = numMap.get(numbers[i]).get(0)+1; array[1] = numMap.get(result).get(0)+1 ; } break; } } Arrays.sort(array); return array; } }
Update【2014年6月30日13:33:35】 更新Java简单方法以及python代码,同时更新疑问。
public class Solution { public int[] twoSum(int[] numbers, int target) { Map<Integer, Integer> numMap = new HashMap<Integer, Integer>(); int len = numbers.length; int array[] = new int[2]; for(int i = 0; i < len; i++){ if(numMap.containsKey(target - numbers[i])){ array[0] = numMap.get(target - numbers[i]) + 1; array[1] = i + 1; }else{ numMap.put(numbers[i], i); } } return array; } }
2、python速度还可以,172ms
python AC
class Solution: # @return a tuple, (index1, index2) def twoSum(self, num, target): numMap = {} alen = len(num) array = [0, 0] for i in range(alen): if numMap.get(target - num[i]) != None: array[0] = numMap.get(target - num[i]) + 1 array[1] = i + 1; else: numMap[num[i]] = i return array
3、疑问
如果数组中有重复数据,其实输出是不太一样的,例如输入为[2,2,3,7,6],target为5,前三种javaAC代码输出为[1,3],更新的这两种输出为[2,3],不过都AC了,不知道LeetCode是怎么判断结果的。
2、【九度】题目1352:和为S的两个数字Java AC
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class Main { /* * 1352 */ public static void main(String[] args) throws Exception { StreamTokenizer st = new StreamTokenizer (new BufferedReader(new InputStreamReader(System.in))); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; st.nextToken(); int k = (int) st.nval; int array[] = new int[n]; for (int i = 0; i < n; i++) { st.nextToken(); array[i] = (int) st.nval; } int low = 0 ; int high = n - 1; while (low < high) { if (array[low] + array[high] > k) { high -- ; }else if (array[low] + array[high] < k) { low ++; }else { break; } } if( low < high ){ System.out.println(array[low]+" "+array[high]); }else { System.out.println("-1 -1"); } } } } /************************************************************** Problem: 1352 User: wzqwsrf Language: Java Result: Accepted Time:3290 ms Memory:30608 kb ****************************************************************/