001-两数之和:
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$keys=array();
foreach($nums as $key=>$value){
$need=array_search($target-$value,$nums);
if ($need!==false){
$keys=[$key,$need];
}
}
return $keys?:['这个数组里面不存在这样的组合!'];
}
}
这里面有个潜在的bug,如果要查找的那个数刚好是本身,就会出错,例如
[20,40,15,30,20],40
改进代码如下:
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$keys=array();
foreach($nums as $key=>$value){
$need=array_search($target-$value,$nums);
if (!($need==false||$need==$key)){
$keys=[$need,$key];
}
}
return $keys;
}
}
这个应该还有很大的提升空间,欢迎留言写出更好的方法.
经过查询别人提交的代码,12ms的同学的代码如下:
<?php
class Solution
{
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
public function twoSum($nums, $target)
{
$len = count($nums);
$data = [];
foreach ($nums as $i => $v) {
$poor = $target - $v;
$data[$poor] = $i;
}
foreach ($nums as $i => $v) {
if (isset($data[$v]) && $data[$v] != $i) {
return [$i, $data[$v]];
}
}
}
}