所定の規則配列は、それらの和が目標数の和に等しくなるように2つの数値を見つけるために応じて昇順にソートされています。 機能はindex1のINDEX2未満でなければならない2つの指標値からindex1 INDEX2を返す必要があります。 説明: インデックス値(インデックス1、INDEX2をして)返し、ゼロではありません。 あなたは、各入力のみ唯一の答えに対応すると仮定することができますが、同じ要素を再利用することはできません。 例: 入力:番号 = [2,7 ,. 11、15]、目標= 9 出力:[ 1,2 ] 説明: 2および7は、ターゲット番号9の和に等しいです。従って= 1、INDEX2 = 2をINDEX1。
問題解決のためのアイデア
1.暴力はアウト時間、テーブルを打ちます
クラスソリューション{ 公共 のint [] twoSum(INT []数字、int型のターゲット){ ため(int型、iはnumbers.lengthを<; I = 0 iは++ ){ ため(int型 J = I + 1、J <numbers.length、J ++ ){ もし、((番号[I] +数字[J])== ターゲット){ 戻り 新しい INTを [] {I + 1、J + 1 }。 } } } スロー 新しい例外:IllegalArgumentException( "!参数不存在を" ); } }
2.ダブルポインタの衝突(公式ソリューション)
クラスソリューション{
公共のint [] twoSum(INT []数字、int型のターゲット){
int型左= 0 。
int型、右= numbers.length - 1 。 一方(左< 右){ IF((番号[左] +数字[右])> ターゲット){right-- 。}そうであれば((番号[左] +数字[右])< ターゲット){++左。}他{新しい戻りINT [] {+ 1左右+ 1 }。}}( "找不到参数"新しいのRuntimeExceptionを投げます)。}}
O(N)の時間複雑さ、空間的複雑度はO(1)であります
(コメント)3.二分法は、開始クエリ位置の二分法の境界値を指定する必要が少し大きいピットであります
クラスソリューション{ 公共 のint [] twoSum(INT []つき、int型のターゲット){ ため(int型 ; Iはnumbers.length <I ++はI = 0 ){ //ターゲット番号を検索[i]を2点位置で、メモを境界値 // バイナリ検索が位置I + 1を開始するままにしておく必要があり、そうでない場合、テストのために[1、2、3、4、4、9、56、90]図8に示すように、状況に[4,4]を返すだろうが表示され 、INTを = binarySearch右(数字は、I + 1、numbers.length - 1、ターゲット- 数字は、[I]); IFは(!右= -1 ){ 戻り 新しい新規 のint [] {I + 1、右+ 1です。}; } } スロー 新新例外:IllegalArgumentException(); } 公共 INT binarySearch(int型 NUMSは[]、int型左、INT右、int型のターゲットを){ ながら(左<= 右){ int型ミッド=(左+右)/ 2 。 もし(NUMS [中間] == ターゲット){ 戻り中間と、 } そう であれば(NUMS [中間] < ターゲット){ 左 =ミッド+ 1 。 } 他{ 右 =ミッド- 1 。 } } 返す -1 ; } }
O(N ^ 2)の時間計算量、空間的複雑度はO(1)であります