Two Sum

一、看到题后反应

     不用搜下竟然可以做,结果超时。

     思路很简单,数组之和找到另一个就可以了。

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)));
	}
}



转载于:https://my.oschina.net/findurl/blog/355984

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值