第14 题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11
思路:因为是已排好序的数组且为升序,则可以在头尾各设置两个指针,依次向中间移动,直到找到和为指定值的两个元素即可,移动指针时,如果两个元素相加大于target,则应该将尾指针向左移动,因为尾指针对应的元素值较大,反之则将头指针向右移动,因为头指针对应的元素较小。
1 package com.rui.microsoft; 2 3 public class Test14_FindTwoElemsInSortArray { 4 5 public static void main(String[] args) { 6 int[] array = {1,2,4,7,11,15}; 7 Test14_FindTwoElemsInSortArray.find(array, 15); 8 } 9 10 public static void find(int[] array, int target){ 11 int start = 0, end = array.length - 1; 12 13 //move pointers from both head and tail 14 //until they intersects 15 while(start < end){ 16 if(array[start] + array[end] == target) break; 17 if(array[start] + array[end] > target) end--; 18 if(array[start] + array[end] < target) start++; 19 } 20 21 if(start >= end){ 22 System.out.println("NOT FIND!"); 23 }else{ 24 System.out.println("FIND! " + array[start] + " " + array[end]); 25 } 26 } 27 }