function maxProfit($prices) {
$n = count($prices);
if ($n == 0) return 0;
$minPrice = $prices[0];
$dp = array_fill(0, $n, 0);
for ($i = 1; $i < $n; $i++) {
$minPrice = min($minPrice, $prices[$i]);
$dp[$i] = max($dp[$i - 1], $prices[$i] - $minPrice);
}
return $dp[$n - 1];
}
$prices = [7,1,5,3,6,4];
echo maxProfit($prices); // 输出 5(第二天买入1,第五天卖出6)
太史公曰:这个还是一样的,只是写法不一样,开始是查数组的长度,为0,那么收益为0,然后把第一个当成最小值,接着又定义了一个数组,n个元素,都是0,这个和原数组的个数是一样的,然后是遍历,从第二个开始,比较,取小值,然后再比较,取大值,是不是有点懵了,一个是当前值,减去小值,一个是新数组的第一个元素,前面为什么要取小值,假如说是1,2,3,4,5,把1当成小值,从2开始,比较,1<2,那么小值是1,可是1本来就是小值啊,变一下,2,1,3,4,5,开始2是小值,和1比较,1小,那么选1,之后呢,用当前值减去小值,当前是1,1-1=0,新数组的第一个也是0,然后赋值,新数组的第二个值为0,这个新数组代表了什么呢,当前卖出的最大收益吗,取小值你不明白,取大值你也不明白,为什么这样你也不明白,要到此为止吗,开始的最小值是假设,不是真的,怎么办呢,比较一下,这个说得过去,之后呢,为什么要当前值减去小的呢,假设说数组是递增的,减去,代表着收益,为什么取大值呢,新定义的数组代表了收益,默认是0,数组是1,2的话,那么第二个值是1,返回这个就行,2,1,那么结果是0,也返回,1,2,3,不对
直接看代码,不好理解,也许可以模拟一下,1,2,3,新数组的结果是什么,0,1,2,返回2,小值是1
1,2,1呢,结果0,1,1,小值是1,哪一天卖出不一定的,不一定是最后,但是结果是返回的最后一个,怎么办呢,前面大的,挪过来,这是硬解,字面上的,可能还不对,无非就是差值最大吗,找个最小的,最大的,所以,先定义了一个小的,然后遍历一遍,找最小的吗,假如说循环里没有第二行代码,结果是什么,两两比较,得到的应当是最小的吧,新数组里面会有负的吗,不会,里面有个减法,已经先比较了,这个值是小的,大减小,肯定不会负的
1,4,3,结果呢,0,3,3,小值是1,3-1=2,这个忽略了,没有存这个,从前往后,找到最小的,然后用当前值和它相减,得到差值最大的,可能还不对
2,4,1,6,结果呢,0,2,2,5,小值是1,可以看到最小值是确定的,但是产生最大差值的不一定是最后一个,也不一定是从最小值那里产生的,有可能中间就产生了,产生的话,把结果往后送
感觉还是有点懵,定义了一个数组,用来保存临时的结果,这个结果后面可能还会用,这么多数据用哪个呢,用紧挨着的,还是硬解,这是解歪了吗,要不要算了,感觉现在你理解不了,所以,你的水平就这,两行代码看不懂,业精于勤,是你自己太懒了吗,可能心思没在这上面,8年时间,一个小菜鸡,有这时间,小学都毕业了,3乘以5,你说等于12,你是去学校上课的,但是这不等于你一定要学会的,你不是这块料,但是学你该上上,总不能让你天天在家捣乱吧,如果是这样的话,那好吧,学不学无所谓,吃饱饭就行,小小年纪就成了混子,后面还要考高中吗,你说呢
要不要再试试,两个数比较求小值,求大值,不用看代码本身,只说比较的,这个你能理解吧,比较小的,是因为要求差值,总不能出现负的吧,假如说现在是第三个数,前面两个谁小呢,有个结果,然后和自己比,谁小呢,比较一下,求差值,假如说当前值大的话,产生的结果一定是最大的吗,第二个数会不会更大呢,比较,取大值,然后返回,先写这么多吧,估计还不对,以后再说
是不是有点上头呢,你还要继续,假如说数组是2,1,5,第一天买,第二天卖,收益0,第三天卖,收益3,第2天买,第三天卖,收益4,三种情况0,3,4,比较,取最大的,这个好理解,这个是正常的,也就是说实际情况是不会比较的,先计算,最后才比较,但是这个怎么转化为代码呢,你又不会了,也就是说现在的这个代码不够直观,所以,你是挑上毛病了
实际情况是三次,但是数组遍历是2次,第一次1-1,第2次5-1,当前值是用到的,到5的时候,不用减2,减1,减小的就行,小的怎么来的,前面比较一下,不好理解,硬解的话,可能也没必要