題目:
給定一個整數陣列 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 協議》,轉載必須註明作者和本文連結