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;
}

未完待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值