[검 지 Offer] 와 s 의 두 숫자.

2739 단어 알고리즘
제목:
정렬 된 배열 과 숫자 s 를 입력 하 십시오. 배열 에서 두 개의 수 를 찾 으 면 이들 의 합 이 바로 s 입 니 다.만약 여러 쌍 의 숫자 가 s 와 같다 면, 임의의 한 쌍 을 출력 하면 된다.
예 를 들 어 설명:
예 를 들 어 배열 {1, 2, 4, 7, 11, 15} 과 숫자 15 를 입력 하 십시오.4 + 11 = 15 이기 때문에 4 와 11 을 출력 합 니 다.
문제 풀이 의 사고 방향.
우 리 는 먼저 배열 에서 두 개의 숫자 를 선택 합 니 다. 만약 그들의 합 이 입력 한 s 와 같다 면 우 리 는 찾 아야 할 두 개의 숫자 를 찾 을 수 있 습 니 다.s 보다 작 으 면?우 리 는 두 숫자의 합 이 좀 더 크 기 를 바란다.배열 이 이미 순 서 를 정 했 기 때문에 우 리 는 비교적 작은 숫자 뒤의 숫자 를 선택 하 는 것 을 고려 할 수 있다.뒤에 있 는 숫자 가 좀 크 기 때문에 두 숫자의 합 도 좀 크 면 입력 한 숫자 s 와 같 을 수 있 습 니 다.마찬가지 로 두 개의 숫자 와 입력 보다 큰 숫자 를 선택 할 때 우 리 는 비교적 큰 숫자 앞 에 있 는 숫자 를 선택 할 수 있다. 왜냐하면 배열 앞 에 있 는 숫자 가 좀 작 기 때문이다.
import java.util.ArrayList;
import java.util.List;

public class Solution {

    /** * * @param data * @param sum * @return */
    public static List<Integer> findNumbersWithSum(int[] data,int sum)
    {
        List<Integer> result = new ArrayList<Integer>(2);
        if(data == null || data.length < 2)
        {
            return result;
        }
        int ahead = data.length - 1;
        int behind = 0;
        long curSum;   //   , long       
        while (behind < ahead) {
            curSum = data[behind] + data[ahead];
            if(curSum == sum)
            {
                result.add(data[behind]);
                result.add(data[ahead]);
                break;
            }
            else if(curSum < sum)
            {
                behind++;
            }
            else
            {
                ahead--;
            }
        }
        return result;
    }
}

좋은 웹페이지 즐겨찾기