java 实现leetcode Two Sum II - Input array is sorted 时间复杂度O(n)

package offer;

public class TwoSumTwo {
	public static void main(String[] args) {
		TwoSumTwo two=new TwoSumTwo();
		int a[] = {3,3,5,8,18,21,22,22,22,24,26,28,29,31,31,34,37,37,40,43,43,43,44,47,48,51,51,51,52,54,55,56,59,59,60,74,74,76,76,81,82,82,82,85,89,91,91,94,99,101,101,106,116,118,121,126,127,128,128,128,131,134,135,138,140,143,145,151,152,153,154,156,158,158,158,160,169,173,174,177,178,180,189,190,190,191,191,196,197,203,203,206,206,206,208,210,212,215,216,218,218,219,223,225,227,229,232,232,233,234,235,235,236,237,238,239,245,249,250,251,254,254,256,260,261,262,270,271,271,274,275,284,285,286,290,290,291,292,292,293,293,293,295,299,300,304,304,305,310,313,313,315,322,326,327,329,334,336,337,339,339,340,341,343,344,347,347,356,356,359,359,361,364,364,368,368,369,376,378,380,380,380,386,387,389,391,391,397,399,404,405,413,415,418,418,423,426,428,429,430,432,434,437,439,459,460,461,461,463,472,479,480,484,484,486,487,492,494,498,499,500,501,501,504,505,505,507,513,517,517,519,519,522,525,525,529,530,530,533,536,537,538,539,542,544,553,557,561,561,564,567,568,568,570,570,572,574,575,575,579,580,581,582,590,591,594,594,597,600,605,607,608,611,614,615,615,619,621,622,623,626,627,628,630,631,632,634,638,640,641,642,648,648,649,659,662,668,673,678,678,682,682,683,683,686,686,687,691,692,693,698,700,700,706,711,711,712,714,714,718,722,727,730,730,733,733,741,744,745,747,749,754,755,755,758,760,762,763,764,769,770,771,771,776,777,784,785,789,790,792,795,795,796,797,798,806,806,806,809,812,813,815,819,820,823,827,830,837,840,843,848,850,851,851,852,857,858,858,859,861,863,866,869,869,873,874,874,883,885,887,889,891,893,899,901,903,905,905,905,909,912,917,919,920,921,922,926,935,940,941,944,945,946,947,948,950,950,951,952,956,956,959,962,964,965,968,970,971,971,972,973,976,978,982,983,985,985,988,989,991,994,994,995,995,997,997};
		int [] result=two.twoSum(a, 101);
		System.out.println(result[0]+" , "+result[1]);       
	}

	  public int[] twoSum(int[] numbers, int target) {
		  int [] result = null;
		   if(numbers[0]>=target || 2* numbers[numbers.length-1]<target) 
	        {
	        	result=null;
	        }
		   //最左侧的起始下标,因为有序数组,所以左边的第一个数应该大于target-numbers[numbers.length-1]
		    int left=findByHalf(numbers, target-numbers[numbers.length-1], 0, numbers.length-1);
	       //最右侧起始下标,右边的最后一个数肯定小于target-numbers[0]
		    int right=findByHalf(numbers, target-numbers[0], 0, numbers.length-1);
	        int i=left,j=right;
	        //首位各有一个指针向中间移动
	        while(i<j)
	        {
	        	if(numbers[i]+numbers[j]<target)i++;
	        	else if(numbers[i]+numbers[j]>target)
	        		j--;
	        	else
	        	{
	        		result=new int[2];
	        		result[0]=i+1;
	        		result[1]=j+1;
	        		break;
	        	}
	        }
	       return result;	        
	    }
	
	  int findByHalf(int a[], int num, int beginIndex, int endIndex)
	  {
		  int left=beginIndex;
		  int right=endIndex;
		  while(left<right)
		  {
	      int mid=(left+right)/2;
		  if(a[mid]>num)right=mid-1;
		  if(a[mid]<num)left=mid+1;
		  if(a[mid]==num)return mid;
		  }		 
		  return left;
	  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值