leetcode 刷题php实现
1.两数之和
/**
* 示例:给定 nums = [2, 7, 11, 15], target = 9
* 因为 nums[0] + nums[1] = 2 + 7 = 9
* 所以返回 [0, 1]
* 利用关联数组,将当前数值与目标数值的差作为新数组的下标,后面遍历的时候如果这个新数据有对应的下标,说明这两个数就是我们要求的结果。
*/
<?php
function twoSum($nums, $target) {
$result = [];
foreach($nums as $key => $item) {
if (isset($result[$item])) {
return [$result[$item],$key];
} else {
$result[$target-$item] = $key;
}
}
return $result;
}
2.三数之和
/**
* 是两数之和的延伸,leetcode 15题
* example:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
* 思想是用两个指针,一个指向当前数据的下一个值left,一个指向数组最后一个值right。
* 然后循环,求三个数据的和是否等于0,如果小于0,左边left就+1,大于0就右边right-1,如果相等就放到一个二维数组中。
*/
<?php
function threeSum($arr)
{
sort($arr);
$n = count($arr);
$tmp = [];
for ($i = 0; $i < $n; $i++) {
if ($arr[$i] > 0) break;
if ($i > 0 && $arr[$i] == $arr[$i-1]) continue;
$left = $i+1;
$right = $n - 1;
while ($left < $right) {
$sum = $arr[$i] + $arr[$left] + $arr[$right];
if ($sum == 0) {
$tmp[] = [$arr[$i], $arr[$left], $arr[$right]];
while ($left < $right && $arr[$left] == $arr[++$left]);
while ($left < $right && $arr[$right] == $arr[--$right]);
} elseif ($sum < 0) {
$left++;
} else {
$right--;
}
}
}
return $tmp;
}
3.无重复字符串的最大子串
/**
* example:
* 输入: "abcabcbb"
* 输出: 3
* 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
* 利用滑动窗口
* i记录当前数据在上一次结果中的索引位置,j记录当前位置
* 最长不重复的就是 j - i + 1;
*/
<?php
function lengthOfLongestSubstring($s)
{
$st = [];
$len = strlen($s);
$i = $ans = 0;
for($j = 0; $j < $len; $j++) {
if (in_array($s[$j], array_keys($st))) {
$i = max($st[$s[$j]], $i);
}
$ans = max($ans, $j - $i + 1);
$st[$s[$j]] = $j + 1;
}
return $ans;
}
未完待续。。。