题目:https://oj.leetcode.com/problems/two-sum/
题意:给定一个数组,和一个target,要求你找出数组中两个元素之和为target 的index,数据保证一定有一个解
/**
* Two Sum
*
* Given an array of integers, find two numbers such that they add up to a
* specific target number.
*
* The function twoSum should return indices of the two numbers such that they
* add up to the target, where index1 must be less than index2.
*
* Please note that your returned answers (both index1 and index2) are not
* zero-based.
*
* You may assume that each input would have exactly one solution.
*
* @Input: numbers={2, 7, 11, 15}, target=9
*
* @Output: index1=1, index2=2
*/
解决方案:
暴力:O(n^2)
/**
* @author lrbrbl
* Method 1: 暴力求解
* 复杂度: O(n^2)
*/
class Solution {
public int[] twoSum(int[] numbers, int target) {
int ans[] = new int[2];
int len = numbers.length;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (numbers[i] + numbers[j] == target) {
ans[0] = i + 1;
ans[1] = j + 1;
return ans;
}
}
}
return null;
}
}
先排序,后处理: O(nlog(n))
import java.util.ArrayList;
import java.util.Collections;
/**
* Method 2: Sort and Find
* 复杂度: O(nlog(n))
*/
class Node implements Comparable<Node>{
public int val;
public int idx;
public Node(int val, int idx) {
this.val = val;
this.idx = idx;
}
public int compareTo(Node o) {
return this.val < o.val ? -1 : 1;
}
}
class Solution2 {
public int[] twoSum(int[] numbers, int target) {
ArrayList<Node> al = new ArrayList<Node>();
int ans[] = new int[2];
int len = numbers.length;
for(int i = 0; i < len; i++){
al.add(new Node(numbers[i],i));
}
Collections.sort(al);
int l = 0, r = len -1;
while(l < r){
int sum = al.get(l).val+ al.get(r).val;
if(al.get(l).val+ al.get(r).val == target){
ans[0] = Math.min(al.get(l).idx, al.get(r).idx)+1;
ans[1] = Math.max(al.get(l).idx, al.get(r).idx)+1;
break;
} else if(sum > target){
r--;
}else{
l++;
}
}
return ans;
}
}
Hash:O(n)
import java.util.HashMap;
/*
* Method 3: Hash/Map
* 复杂度: O(n)
*/
class Solution3{
public int[] twoSum(int[] numbers, int target) {
int len = numbers.length;
HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
for(int i = 0; i < len; i++){
hm.put(numbers[i], i);
}
int ans[] = new int[2];
for(int i = 0; i < len; i++){
if(hm.get(target-numbers[i]) != null){
ans[0] = i+1;
ans[1] = hm.get(target-numbers[i])+1;
if(ans[0] != ans[1])
break;
}
}
return ans;
}
}