题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 $O(n)$。
我们假设使用 $f(i)$ 表示以第 $i$ 个数字结尾的子数组的最大和,那么 $f(i +1)$ 与 $f(i)$ 的关系为
$$ f(i) = \begin{cases} f(i - 1) + data[i], & f(i - 1) > 0 \\ data[i], & f(i) \leq 0 \end{cases} $$如果 $f(i - 1)$ 小于 $0$ 的话,那么 $f(i - 1) + data[i] < data[i]$,所以以第 $i$ 个数字结尾的数组最大和为 $data[i]$。我们最终的目标是寻找 $max [ f(i) ], i = 0, 1, …, n - 1$,所以代码如下
public static int findGreastSumOfSubArray(int[] data) { |
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含
'a'~'z'
的字符。例如,在字符串"arabcacfr"
中,最长的不含重复字符的子字符串是"acfr"
,长度为 $4$。
我们定义 $f(i)$ 表示以第 $i$ 个字符结尾的不包含重复字符的子字符串的最长长度,那么 $f(i)$ 与 $f(i - 1)$ 的关系是什么呢?
- 第 $i$ 个字符从来没有出现过,那么 $f(i) = f(i - 1) + 1$
- 第 $i$ 个字符以前出现过,这个时候要分两种情况考虑
- 以前出现过的字符在以 $f(i - 1)$ 表示的子字符串之中,记这两个重复的字符间的距离为 $d$,并且满足 $d \leq f(i - 1)$,这时 $f(i)$ 就是 $d$
- 如果以前出现的字符在 $f(i - 1)$ 表示的子字符串以外,那么该字符对于 $f(i)$ 来说还是未重复的,所以 $f(i) = f(i - 1) + 1$
代码如下
public static int getLongestStringWithoutDuplication(String string) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Coder!
评论