二受け面接必筆:BM50 2つの数字の合計
序文
整数の配列番号とターゲット値 target が与えられた場合、配列内の合計がターゲット値になる 2 つの数値の添え字を見つけてください。返される添え字は昇順に並べられます。
(注: 返される配列の添え字は 1 から始まり、配列内の 2 つの数値を加算することでターゲットを取得できることが保証されます)
1. 解決策 1: ハッシュ テーブル
ハッシュ テーブルの考え方は「空間を時間と交換する」です。これは、ハッシュ テーブルがキーと値のペアを格納し、その「検索」の複雑さが O(1) であるためです。
-
この質問に対する具体的な解決策のアイデアは次のとおりです (図に示すように)。
- ステップ 1: キーと値のペアを <value, subscript> として保存するハッシュ テーブルのハッシュマップを定義します。
- ステップ 2: 配列を最初から走査します。i 番目の位置について、ハッシュ テーブルで target-nums[i] の存在を探します。存在する場合は、2 つの添字を配列に入れて戻ります。存在しない場合は、テーブルに追加してトラバースを続ける
import java.util.*;
public class Solution {
/**
*
* @param numbers int整型一维数组
* @param target int整型
* @return int整型一维数组
*/
public int[] twoSum (int[] numbers, int target) {
// write code here
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < numbers.length ; i++){
if(map.containsKey(target - numbers[i])){
return new int[]{
map.get(target - numbers[i]) + 1,i + 1};
}
else{
map.put(numbers[i],i);
}
}
return new int[]{
0,0};
}
}