1. 程式人生 > >php 找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值

php 找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值

有關於php的有好幾種思路,很多部落格都有我就不一一介紹了,只是貼程式碼僅供參考。

問題:給一個一維陣列,不確定具體有多少元素,例如$arr = [1,2,3,4,3,2,1],讓他們任意兩數字相加的和等於一個給定的值,比如說 5 ,可能有好幾個兩個數相加都是5,但只是取最先開始兩個相加的數等於5的,這兩個數的索引。
先貼php程式碼,兩種方式,一種兩個for迴圈,另外一種一個迴圈
第一種:
function twoSum($arr, $sum)
{
    $len = count($arr);
    if ($len < 2) return false;
    $tmp = [];
    $repeat = [];
    $flag = [];
    for ($j = 0; $j < $len; $j++) {
        $minus = $sum - $arr[$j];
        unset($arr[$j]);
        foreach($arr as $key => $two) {
            if( $minus == $two ) {
                echo '索引值為['.$j.','.$key.']';die;
            }
        }
     }
}
$arr = [1, 1, 1, 3];
// $arr = [1,2,2,2,8,8,6,5,4,10];
twoSum($arr, 2);

第二種:
function xiao( $arr, $sum )
{
    $len = count($arr);
    for($j = 0; $j < $len; $j++) {
        $minus = $sum - $arr[$j];
        unset($arr[$j]);
        $two = array_search("$minus",$arr);
        if( $two ){
            echo '陣列的索引值為['.$j.','.$two.']';die;
        }
    }
}
$arr = [3,3,3,3,4];
xiao($arr,6);

可以看一下時間複雜度,第二種比較合適,有bug的話,歡迎提出
python程式碼:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in nums:
            if target-i in nums:
                if (target - i == i and nums.count(i) >= 2) or target - i != i:
                    a=nums.index(i)
                    b=nums.index(target - i, a + 1, len(nums))
                    return [a,b]

s = Solution()

print(s.twoSum([1,2,3,4,5], 9))

時間複雜度也是比較低的,建議用這種