一、看到题后反应
不用搜下竟然可以做,结果超时。
思路很简单,数组之和找到另一个就可以了。
public int[] twoSum(int[] numbers, int target) {
int result[]=new int[]{0,0,0};
for(int i=0;i<numbers.length;i++){
if(find(numbers,target-numbers[i])){
if(numbers[i]<target-numbers[i]){
result[1]=numbers[i];
result[2]=target-numbers[i];
}else{
result[2]=numbers[i];
result[1]=target-numbers[i];
}
break;
}
}
return result;
}
public boolean find(int []numbers,int num){
for(int i=0;i<numbers.length;i++){
if(num==numbers[i])
return true;
}
return false;
}
二、优化改变
感觉问题出在了,查找上,决定用下二分查找来
问题一大堆来了,首先要排序吧。
只能得到结果存在。
重新定位。
特殊情况处理。
插曲,数组赋值不会了。公用了一个地址。
上次那个二位数组的x,y不知道怎么得到。 呵呵下来
import java.util.Arrays;
/**
* 找一个和来 数字组成的
*/
public class TwoSum {
public int[] twoSum(int[] numbers, int target) {
int result[]=new int[]{0,0};
int temp[]=new int[numbers.length];
System.arraycopy(numbers, 0, temp, 0, numbers.length);
Arrays.sort(numbers);
for(int i=0;i<numbers.length;i++){
int find=binarySearch(numbers,0,target-numbers[i]);
if(find!=-1){
result[0]=numbers[i];
result[1]=target-numbers[i];
break;
}
}
if(result[0]!=result[1]){
result[0]=find(temp,0,result[0])+1;
result[1]=find(temp,0,result[1])+1;
}else{
result[0]=find(temp,0,result[0])+1;
result[1]=find(temp,result[0],result[1])+1;
}
if(result[0]>result[1]){
result[0]=result[0]+result[1];
result[1]=result[0]-result[1];
result[0]=result[0]-result[1];
}
return result;
}
public int find(int []numbers,int n,int num){
for(int i=n;i<numbers.length;i++){
if(num==numbers[i])
return i;
}
return -1;
}
/**
* 二分查找来
*/
public int binarySearch(int[]array,int n,int value){
int left=n;
int right=array.length-1;
while(left<=right){
int middle=left+(right-left)/2;
if(array[middle]>value){
right=middle-1;
}else if(array[middle]<value){
left=middle+1;
}else{
return middle;
}
}
return -1;
}
public static void main(String[] args) {
TwoSum ts=new TwoSum();
System.out.println(Arrays.toString(ts.twoSum(new int[]{0,4,3,0}, 0)));
}
}