方法一:两个for遍历,没什么好说的
class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] arr = new int[2];
for(int i=0;i<numbers.length;i++){
for(int j=i+1;j<numbers.length;j++){
if(numbers[i]+numbers[j] == target){
arr[0] = i+1;
arr[1] = j+1;
return arr;
}
else if(numbers[i]+numbers[j] > target)
break;
}
}
return null;
}
}
方法二:Haspmap,看是否包含target - nums[i] 的键
class Solution {
public int[] twoSum(int[] numbers, int target) {
HashMap<Integer,Integer> hashmap = new HashMap<Integer,Integer>();
for(int i=0; i<numbers.length;i++){
if(hashmap.containsKey(target - numbers[i]))
return new int[]{hashmap.get(target - numbers[i])+1, i+1};
else
hashmap.put(numbers[i],i);
}
return new int[0];
}
}
方法三:二分法,先确定第一个值,然后找第二个,顺带一提,java自带工具类的二分法性能比自己写的好像好很多
class Solution {
public int[] twoSum(int[] numbers, int target) {
for(int i=0;i<numbers.length;i++){
int index = Arrays.binarySearch(numbers,target - numbers[i]);
if(index>=0 && index != i){
return i<index ? new int[]{i+1,index+1}:new int[]{index+1,i+1};
}
}
return new int[0];
}
}
class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] arr = new int[2];
for(int i=0;i<numbers.length;i++){
int left = i+1;
int right = numbers.length-1;
while(left <= right){
int mid = (right - left)/2+left;
if(numbers[mid] == target-numbers[i])
return new int[]{i+1,mid+1};
else if(numbers[mid] > target - numbers[i]){
right = mid -1;
}
else{
left = mid +1;
}
}
}
return new int[]{-1,-1};
}
}
方法四:双指针,left right, 如果nums[left] + nums[right] > target ,则right – ,反之left ++,循环条件while(left < right)
代码不贴了,可以去力扣看,很详细
力扣两数之和2