1つのインクリメンタルソートの配列と1つの数字Sを入力し、配列の中で2つの数を検索し、彼らの和がちょうどSであるようにし、複数の数字の和がSに等しい場合、2つの数の積が最小になるように出力します.出力説明:各テストケースに対応して、2つの数を出力し、小さな先出力を出力します.

2526 ワード

1つのインクリメンタルソートの配列と1つの数字Sを入力し、配列の中で2つの数を検索し、彼らの和がちょうどSであるようにし、複数の数字の和がSに等しい場合、2つの数の積が最小になるように出力します. 
出力の説明:
 , , 。

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出典:牛客網
数列はインクリメントを満たし、2つのヘッダとテールの2つのポインタiとjを設定する.
ai+aj==sumなら、答えです(差が遠ければ遠いほど積が小さくなります)
ai+aj>sumの場合、ajは答えの1つではないに違いない(前にiの前の数が得られない)、j-=1
ai+ajO(n)証明:
見つかった最初のグループ(差が最も大きい)は、積が最も小さいことです.x+y=C(Cは定数)を考慮してx*yの大きさを証明できる.y>=x、y-x=d>=0、すなわちy=x+d、2 x+d=C、x=(C-d)/2、x*y=x(x+d)=(C-d)(C+d)/4=(C^2-d^2)/4、すなわちx*yは変数dに関する二次関数であり、対称軸は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;
    }
}