两数之和
27%
通过
给一个整数数组,找到两个数使得他们的和等于一个给定的数target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。
您在真实的面试中是否遇到过这个题?
Yes
样例
numbers=[2, 7, 11, 15], target=9
return [1, 2]
注意
你可以假设只有一组答案。
标签 Expand
相关题目 Expand
解题思路:
解法1:O(n^2)时间复杂度
public class Solution {
/*
* @param numbers : An array of Integer
* @param target : target = numbers[index1] + numbers[index2]
* @return : [index1 + 1, index2 + 1] (index1 < index2)
*/
public int[] twoSum(int[] numbers, int target) {
// write your code here
if(null==numbers||2>numbers.length) return null;
int[] res = new int[2];
for(int i=0;i<numbers.length;i++){
for(int j=1;j<numbers.length;j++){
if(numbers[i]+numbers[j]==target){
res[0] = i+1;
res[1] = j+1;
return res;
}
}
}
return res;
}
}
<span><span style="font: 32px/normal 华文楷体; color: rgb(77, 206, 29); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">解法2:双指针O(N^logN)时间复杂度,O(N)空间复杂度</span></span>
public class Solution {
/*
* @param numbers : An array of Integer
* @param target : target = numbers[index1] + numbers[index2]
* @return : [index1 + 1, index2 + 1] (index1 < index2)
*/
public int[] twoSum(int[] numbers, int target) {
// write your code here
if (null == numbers || 2 > numbers.length)
return null;
int[] res = new int[2];
ArrayList<Integer> tmp = new ArrayList<>();
for(int i=0;i<numbers.length;i++){
tmp.add(numbers[i]);
}
Collections.sort(tmp);
int s = 0;
int e = numbers.length - 1;
while (s < e) {
if (tmp.get(s)+tmp.get(e) == target) {
break;
} else if (tmp.get(s)+tmp.get(e) > target) {
e--;
} else {
s++;
}
}
if(s<e){
res = findIndex(numbers, tmp.get(s), tmp.get(e));
return res;
}else{
return null;
}
}
public int[] findIndex(int[] numbers,int add1,int add2){
int[] res = new int[2];
int count = 0;
for(int i=0;i<numbers.length;i++){
if(numbers[i]==add1||numbers[i]==add2){
res[count++] = i+1;
}
}
return res;
}
}