用 PHP 在 力扣 刷算法 [两数之和]{一天一更}
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解析:
在数组中,找到两个数的和等于目标的值,并返回这两个数的键。
解法:
1、两次循环中查找结果,当有这样的值得时候退出,俗称暴力解法。
2、用传说的中的 HashMap ,其实在PHP中就是数组,这个数组就是原数组的键值交换,我们就可以 HashMap了。哈哈~~,在这个数组中 查找目标值减去 当前值在这个数组中是否存在键,有就返回键,没有就继续键值交换。
3、直接操作 PHP 数组,目标值减当前值在数组中是否有值,有返回键,没有继续。为了防止用重复,要删除当前数组的当前值。
看的一脸懵逼,让我们用伟大的 PHP 来一一实现一下:
1、暴力整:
class Solution {
/**
* 暴力解法
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$len = count($nums);
if ($len < 2 ){
return false;
}
for ($i = 0; $i < $len; $i++){
for ($j = $i + 1; $j < $len; $j++){
if ($nums[$i] + $nums[$j] == $target){
return [$i, $j];
}
}
}
}
}
2, HashMap一下,什么是HashMap? 嗯…就是PHP数组!!!哈哈…
class Solution {
/**
* HashMap
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$len = count($nums);
if(count($nums) < 2){
return false;
}
// 申明一个空数组,专业的说就叫申明一块空间存储映射关系,2333
$arr = [];
foreach($nums as $key => $value){
// 判断当前值和目标值的差是否在申明数组的键中存在
if(array_key_exists($target - $value, $arr)){
return [$key, $arr[$target - $value]];
}
// 没有直接记录下来
$arr[$value] = $key;
}
}
}
3、直接数组中操作:
class Solution {
/**
* 直接数组
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$len = count($nums);
if(count($nums) < 2){
return false;
}
foreach ($nums as $key => $value){
// 删除自己 免得自己加自己
unset($nums[$key]);
// 如果目标值减去当前值在数组中存在,返回
if (in_array($target - $value, $nums)){
// array_search()返回值对应的键
return [$key, array_search($target-$value, $nums)];
}
}
}
}
那么,问题来了,那个算法更好呢?
哈哈…世界上没有更好算法,只有你想要得到什么!!!
催牛,你从成都到北京,直接飞机过去和飞机绕一圈地球过去,肯定直接飞机过去好啊!这个真不好说,我就喜欢做飞机呀,飞机能让我达到人生巅峰。不是吗?
以上这些算法,不同的方式时间和空间都在发生改变哦。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: