第三个测试用例PHP for循环不递增

Third test case PHP for loop does not increment

给定一个整数数组 nums 和一个整数 target,return 两个数字的索引使得它们加起来等于 target。我尝试了以下解决方案的一些修改版本。

function twoSum($nums, $target) {
    $arr = array();
    for($i = 0; $i < count($nums); $i++){
        
        if($nums[$i] + $nums[$i+1] == $target){
            array_push($arr, array_search($nums[$i], $nums), array_search($nums[++$i], $nums));
            break;
        }
    }
    return $arr;
}

当通过三个测试用例时,前两个 return 最后一个案例的正确结果 return 第一个正确的索引,但最后一个索引(技术上)不正确。

使用的测试用例:

  1. nums = [2,7,11,15], 目标 = 9
    预期输出:[0,1]
    实际输出:[0,1]

  2. nums = [3,2,4], 目标 = 6
    预期输出:[1,2]
    实际输出:[1,2]

  3. nums = [3,3], 目标 = 6
    预期输出:[0,1]
    实际输出:[0,0]

您的方法不正确,因为您假设 2 个连续的索引可以导致此行中的目标值,这是不正确的。这对可以是任意组合。

$nums[$i] + $nums[$i+1] == $target

它也不考虑 $i + 1 的索引越界异常。无论如何,其余代码肯定会朝着错误的方向发展。


解决这个问题的步骤非常简单。

  • 使用一个简单的关联数组,例如 $set,它将键存储为数组元素,将值存储为该元素在数组中的索引。

  • 现在,当遍历数组时,如果 target - current_element 键(另一个数字)存在于 $set 中,你就得到了对。

片段:

<?php

function twoSum($nums, $target) {
    $set = [];
    foreach($nums as $index => $curr_element){
        $cousin_value = $target - $curr_element;
        if(isset( $set[ $cousin_value ] )){
            return [  $set[ $cousin_value ], $index ];
        }
        $set[ $curr_element ] = $index;
    }
    return -1;
}

print_r(twoSum([3,3],6));