用 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 协议》,转载必须注明作者和本文链接
join_jiang
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
调调

我猜第二种

3年前 评论

我猜我的最快,哈哈哈


public function twoSum($nums, $target)
 {
        $arr = [];
        for ($i = 0; $i < count($nums); $i++) {
            $diffValue = $target - $nums[$i];
            if (isset($arr[$diffValue])) {
                return [$arr[$diffValue], $i];
            }
            $arr[$nums[$i]] = $i;
        }
}
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!