用 PHP 在 力扣 上演算法 [兩數之和]{一天一更}

666666發表於2020-05-13

題目:
給定一個整數陣列 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

相關文章