删除排序数组中的重复项
class Solution {
/**
* 删除排序数组中的重复项 时间复杂度O(1)
* @param $nums
* @return array
*/
function removeDuplicates(&$nums): array
{
$count = count($nums);
if ($count <= 0) {
return [];
}
$number = $nums[0];
for ($i=1; $i<$count; $i++) {
if ($number != $nums[$i]) {
$number = $nums[$i];
} else {
unset($nums[$i]);
}
}
return $nums;
}
}
$nums = [1,1,2];
print_r((new Solution())->removeDuplicates($nums));
返回两数之和的下标
- 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标
class Sum
{
/**
* 返回两数之和的下标
* @param array $nums
* @param int $target
* @return array|null
*/
public function twoSum(array $nums, int $target): ?array
{
$result = [];
for ($i = 0; $i < count($nums); $i++) {
for ($j = $i + 1; $j < count($nums); $j++) {
if ($nums[$i] + $nums[$j] == $target) {
$result[0] = $i;
$result[1] = $j;
return $result;
}
}
}
return null;
}
}
//print_r((new Sum())->twoSum([3,2,4],6)); //返回[1,2]
print_r((new Sum())->twoSum([2,7,11,15],9)); //返回[1,2]
买卖股票的最佳时机
- 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
- 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
class Prices
{
//买卖股票的最佳时机
//给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
//设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
public function maxProfit(array $prices = []):int
{
if ($prices == null || count($prices) < 2) {
return 0;
}
$length = count($prices);
$hold = -$prices[0];
$noHold = 0;
for ($i = 1; $i < $length; $i++) {
//推导公式
$noHold = max($noHold, $hold + $prices[$i]);
$hold = max($hold, $noHold - $prices[$i]);
}
return $noHold;
}
}
$prices = [7,6,4,3,1];
print_r((new Prices())->maxProfit($prices));