最もホットな質問100の質問1:
方法1:ブルートフォース列挙法
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
}
アイデア:この質問では、ターゲットに等しい配列内の2つの数値の合計を見つけ、最初の数値がiであり、2番目の数値がtarget-iであると想定し、配列を直接トラバースしてiを見つけ、次にこれをトラバースする必要があります。ループ中に、配列を再度トラバースして、target-i、つまり2層ループトラバーサルを見つけます。時間計算量:O(N ^ 2)O(N2);空間計算量:O(1)O(1)。
方法2:ハッシュテーブルを使用する
class Solution {
public int[] twoSum(int[] nums, int target) {
//新建哈希表,用于存储数据;key为下表为i的值,value为数组的下标
Map<Integer,Integer> map = new HashMap<>();
//for循环遍历数组,先判断哈希表中是否存在target-i,若不存在将当前i的值和下标i存入哈希表
for(int i = 0;i < nums.length;i++){
int cur = nums[i];
if(map.containsKey(target - cur)){
return new int[]{i,map.get(target - cur)};
}
map.put(cur,i);
}
//哈希表遍历完都没返回,说明数组中不存在和为target的两个数
return new int[]{0};
}
}
アイデア:方法1を使用すると実際に問題を解決できますが、必要な時間計算量が高すぎるため、より効率的な方法はありますか?答えはイエスです。
タイトルから、返す必要のある2つの数値の合計がターゲットであり、最初の数値がiであると想定され、次に他の数値がターゲットであることがわかります-i、iにトラバースするとき、前のトラバースを見てくださいの数にtarget-iはありますか?ある場合、ループのレイヤーを保存できますか?したがって、ここでは、以前にトラバースされたデータを格納するためにハッシュテーブルを参照します。
新しいハッシュテーブルを作成したら、配列のトラバースを開始します。最初は、ハッシュテーブルに要素がないため、見つからないようにする必要があります。ハッシュテーブルにtarget-iが見つからない場合は、現在のi値を保存します。ハッシュテーブルに移動し、2つの数値が見つかるまでトラバースを続けます。