題目:
https://leetcode-cn.com/problems/two-sum/
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
整體思路:
先用O(n)複雜度生成哈希表,key爲值,value爲下標,通過迭代待定數組去判斷差值是否存在即可。
代碼思路:
- 迭代給定數組,生成value-key的哈希表,結構爲數組,存value相同key不同的
- 迭代給定數組,用目標值減去當前值結果如果和當前值相等,判斷哈希表中是否存在key爲當前值的記錄,如果有執行3,沒有繼續下一次迭代
- 如果減數和差相等且hash表中key值是大於1,則存在相同的兩個數符合要求,返回對應下標;如果減數和差不相等,則存在兩個不同的數符合要求。
代碼:
<?php
function twoSum($nums, $target) {
$arr = [];
foreach ($nums as $k => $v){
$arr[$v][] = $k;
}
foreach ($nums as $key => $num){
$diff = $target - $num;
if (isset($arr[$diff])){
if ( $diff == $num && count($arr[$diff]) > 1){
return $arr[$diff];
}
if ($diff != $num){
return [$arr[$num][0], $arr[$diff][0]];
}
}
}
}
$nums = [2, 7, 11, 15];
$target = 9;
print_r(twoSum($nums, $target));
結果:
$php two_sum.php
Array
(
[0] => 0
[1] => 1
)