微软算法100题14 在排序数组中找到和为指定数的任意两个元素

第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 }

 

posted @ 2015-10-23 17:12  蟹粉小笼包  阅读(842)  评论(0编辑  收藏  举报