タイトル:整数配列numsとターゲット値targetが与えられた場合、合計が配列内のターゲット値である2つの整数を見つけて、それらの配列添え字を返します。
各入力は1つの回答にのみ対応すると想定できます。ただし、配列内の同じ要素を2回使用することはできません
例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法1:暴力的な解決策
アイデア:
可能なすべてのペアワイズの組み合わせを配列に追加し、それらをターゲット番号と比較します。それらが等しい場合、2つの要素に対応するインデックスが目的の結果になります。あなたは賢いと信じています、あなたはすでにダブルforループを通してそれを解決することを考えています
class LeetCode0001
{
public function twoSum($nums, $target)
{
$len = count($nums);
for($i = 0; $i< $len; $i++) {
for ($j=$i+1; $j<$len;$j++) {
if ($nums[$i] + $nums[$j] == $target) {
return [$i, $j];
}
}
}
}
}
時間計算量は次のとおりです。O(n ^ 2)
スペースの複雑さ:O(1)
方法2:アレイフリップ
アイデア:
A + B = target
A和B是数组中的元素,targer为目标值
別の考え方では、配列内の2つの要素の合計がターゲット数であるため、
- ターゲット値のターゲットを取得し、配列内の要素A / Bを減算します。取得される値A / Bも、配列内の要素である必要があります。
- このようにして、これら2つの値を簡単に見つけることができます。問題は、タイトルに対応する値の添え字が必要なことです。
- 場合に、毎回私は目標数マイナスA / Bの配列におけるターゲット要素、これはみなされ得るA / Bの減刑した要素として、インデックスを新しいものにアレイに、意志値として要素添字新しい配列に対応
- この時点で、phpのarray_key_exists関数を巧みに使用して、ターゲット値ターゲットからA / Bを減算した結果が新しい配列の要素の添え字であるかどうかを判断できます。この添え字に対応する値は、元の配列内の要素に対応するインデックス
説明は少し抽象的で、コードはコード上で一目で理解できます
class LeetCode0001{
public function twoSume2($nums, $target)
{
$len = count($nums);
$flip = [];
for ($i=0; $i<$len; $i++) {
$findValue = $target-$nums[$i];
if (array_key_exists($findValue, $flip)) {
return [$flip[$findValue], $i];
}
$flip[$nums[$i]] = $i;
}
}
}
時間計算量:O(n)
スペースの複雑さ:O(n)
空間を時間と交換する方法