記事ディレクトリ
1.説明
整数配列numsとターゲット値targetを指定して、合計が配列内のターゲット値である2つの整数を見つけ、それらの配列添え字を返します。
各入力は1つの回答にのみ対応すると想定できます。ただし、配列内の同じ要素を2回使用することはできません。
2.例
nums = [2、7、11、15]、target = 9の場合
、nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9
なので、[0、1]を返します。
3.分析
目標:合計が指定された値と等しくなるように、配列から2つの数値を見つけます。
タイトルには2つの制限があります。1つ目のポイントは、特定の値に対して、2つの数値の合計が条件を満たす1つの状況のみが配列に存在することです。2つ目のポイントは、配列内の同じ要素を2回使用できないことです。
3.1。ブルートフォース検索
配列内のすべての値について、ペアワイズマッチングを実行します。それらの合計は指定された値に等しく、これらの2つの数値が見つかります。
2レベルのトラバーサルが必要であり、トラバーサルの各レベルで数値が検索されます。それらの合計が指定された値と等しい場合、検索は停止します。
時間の複雑さ:最悪の場合、O(n 2)O(n ^ 2)O (n2)。
3.2。辞書マッチング
目標値が分かれば、数値の補数を決定できます。
たとえば、2つの数値の合計が9である必要があります。1つは1で、もう1つは何ですか。
もう1つの数値は8(9-1)で、num2 = target-num1です。
この特性を利用できます。
一度配列にアクセスし、現在アクセスしている配列要素をnums [i]として設定し、nums [i]が辞書にすでに存在する(キー)かどうかを調べます。
存在しない場合は、(target-nums [i])を辞書のキー(キー)として使用し、添え字iを辞書の値(値)として挿入します。
既に存在する場合は、(target-nums [i]を指定します)配列numsに存在し、訪問済みである必要があります。その添え字はディクショナリから取得できます。
このようにして、これら2つの数値は1回のトラバースで取得できます。
時間の複雑さ:最悪の場合はO(n)O(n)O (n )。
4.コード
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indices = new int[2];
out:
for(int i = 0; i < nums.length; ++i)
{
for(int j = i + 1; j < nums.length; ++j)
{
if(nums[i] + nums[j] == target)
{
indices[0] = i;
indices[1] = j;
break out;
}
}
}
return indices;
}
}
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indices = new int[2];
Map<Integer, Integer> dict = new HashMap<>();
for(int i = 0; i < nums.length; ++i)
{
if(dict.containsKey(nums[i]))
{
indices[0] = dict.get(nums[i]);
indices[1] = i;
break;
}
else
{
dict.put(target - nums[i], i);
}
}
return indices;
}
}
5.検証
6.ソース
- LeetCode 1. 2つの数値の合計
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/two-sum
著作権はLeetCode が所有しています。商用転載については、正式な許可書にご連絡ください。非商用転載については、出典を明記してください。