167. Two Sum II - Input array is sorted

一、题目

  1、审题

  

  2、分析

    给出一个升序的整形数组,当两个元素之和为 target ,输出这两个元素的下标。(只有一组符合的数)

 

二、解答

  1、思路:

    方法一、

      采用两个指针,start 从前向后移动,end 从后向前移动;当 num[start] + num[end] = target 时,输出。

    public int[] twoSum2(int[] numbers, int target) {
        
        for (int i = 0, j = numbers.length - 1; i < j; ) {
            if(numbers[i] + numbers[j] == target)
                return new int[]{1+i, 1+j};
            else if(numbers[i] + numbers[j] > target)
                j--;
            else
                i++;
        }
        
        return null;
    }

 

  方法二、

    遍历数组,以当前遍历的元素 num1 为假设的第一个符合的数,则 num2 = target - num1,采用二分查找在数组后续部分进行查找。

    public int[] twoSum3(int[] numbers, int target) {
        
        for (int i = 0; i < numbers.length; i++) {
            int start = i + 1;
            int end = numbers.length - 1;
            int tmp = target - numbers[i];
            while(start <= end) {
                int mid = start + ((end - start) >> 1);
                if(numbers[mid] == tmp) 
                    return new int[]{i + 1, mid + 1};
                else if(numbers[mid] < tmp) 
                    start = mid + 1;
                else
                    end = mid - 1;
            }
        }
        return null;
    }

 

posted @ 2018-10-15 22:12  skillking2  阅读(113)  评论(0编辑  收藏  举报