점차적으로 정렬된 수조와 숫자 S를 입력하고 수조에서 두 개의 수를 찾으면 그들의 합이 바로 S이다. 만약에 숫자의 합이 S와 같으면 두 개의 곱셈이 가장 작은 것을 출력한다.출력 설명: 각 테스트 사례에 대응하여 두 개의 수를 출력하고 작은 선출력을 출력합니다.

2612 단어
점차적으로 정렬된 수조와 숫자 S를 입력하고 수조에서 두 개의 수를 찾으면 그들의 합이 바로 S이다. 만약에 숫자의 합이 S와 같으면 두 개의 곱셈이 가장 작은 것을 출력한다. 
출력 설명:
        ,     ,     。

1. 폭력법 범람: (accept) 이해하기 쉽고 올라오면 폭력적이다. 시간의 복잡도 요구가 없으면 직접 이렇게 할 수 있다. 논리가 명확하고 빨리 쓸 수 있다.
import java.util.ArrayList;
import java.util.List;
public class Solution {
    public ArrayList FindNumbersWithSum(int [] array,int sum) {
      ArrayList list = new ArrayList();
    	String two_int = new String();
    	int min_Mul = Integer.MAX_VALUE;
    	for(int i = 0; i < array.length; i++)
    		for(int j = array.length-1; j > i; j--)
    		{
    			if((array[i] + array[j] == sum)&&(array[i] * array[j] < min_Mul))
    			{
    				two_int = "";
    				two_int = String.valueOf(array[i]) +" "+String.valueOf(array[j]);
    				min_Mul = array[i] * array[j];
    				break;
    			}
    				
    		}
    	if(two_int.length() == 0)
    		return list;
    	String[] strarr = two_int.split(" ");
    	list.add(Integer.parseInt(strarr[0]));
    	list.add(Integer.parseInt(strarr[1]));
		return list;
    }
}

2. 좌우로 협박하는 방법을 통해 시간의 복잡도는 O(n)이고 이해하기 쉽지만 폭력적인 방법은 쉽게 생각할 수 없다(블로거와 같은 작은 찌꺼기는 많이 보고 축적해야 한다)
링크:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b소 그물
수열은 증가를 만족시키고 두 개의 머리와 꼬리, 두 개의 지침 i와 j를 설정한다.
만약ai+aj==sum이면 답이다(차이가 클수록 곱셈이 작다)
만약ai+aj>sum,aj는 틀림없이 답안 중의 하나가 아닐 것이다(앞에서 이미 i가 나온 앞의 수는 이미 불가능하다),j-=1
만약ai+ajO(n) 증명:
찾은 첫 번째 조는 곱셈이 가장 작은 것이다.이렇게 증명할 수 있다. x+y=C(C는 상수), x*y의 크기를 고려한다.y>=x, y-x=d>=0, 즉 y=x+d, 2x+d=C, x=(C-d)/2, x*y=x(x+d)=(C-d)(C+d)/4=(C^2-d^2)/4, 즉 x*y는 변수 d에 관한 2차 함수로 대칭축은 y축이고 입구는 아래로 향한다.d는 >=0이고 d가 클수록 x*y도 작아진다.
코드:
import java.util.ArrayList;
import java.util.List;
public class Solution {
    public ArrayList FindNumbersWithSum(int [] array,int sum) {
        ArrayList list = new ArrayList();
   		if (array == null || array.length < 2) 
   			return list;
   	    for(int i = 0, j = array.length-1; i < j; )
   	    {
   	    	if(array[i]+array[j]==sum)
   	    	{
   	    		list.add(array[i]);
   	    		list.add(array[j]);
   	    		return list;
   	    	}
            else if(array[i]+array[j]>sum)
                j--;
            else{
                i++;
   	    }
   	    return list;
    }
}

좋은 웹페이지 즐겨찾기