📜  用正位与求最大子集的大小(1)

📅  最后修改于: 2023-12-03 15:11:19.091000             🧑  作者: Mango

用正位与求最大子集的大小

在计算机科学中,正位(正整数位)、最长上升子序列(Longest Increasing Subsequence,LIS)和最大子集(Maximum Subarray)是常见的问题。

正位

正位(正整数位)是指如 $123$、$456$、$789$ 等这样的数字序列,其中每个数字都比前一个数字大 $1$。例如,$456$ 是 $123456789$ 中的一部分正位子序列。

在计算正位时,一个简单的解决方案是对输入的数字序列进行遍历,检查每个数字是否比前一个数字大 $1$。如果是,则序列中出现了一个新的正位序列,计数器加 $1$。

下面是 Python 代码片段,实现正位的计算:

def countIncreasingSequences(nums):
    count = 1
    for i in range(1, len(nums)):
        if nums[i] == nums[i-1] + 1:
            count += 1
    return count

时间复杂度为 $O(n)$。

最长上升子序列

最长上升子序列(LIS)是指在一个数字序列中,找到一个非连续的子序列,使得子序列中的数字满足单调递增。例如,对于序列 $[10, 9, 2, 5, 3, 7, 101, 18]$,最长上升子序列为 $[2, 3, 7, 101]$,长度为 $4$。

最长上升子序列问题是一个经典的动态规划问题。本质上,LIS 是在一个数字序列中查找最长的子序列,使得该子序列中的数字是单调递增的。因此,该问题可以使用动态规划算法来解决。下面是 Python 代码片段,实现 LIS 的计算:

def lengthOfLIS(nums):
    if not nums:
        return 0
    n = len(nums)
    dp = [1] * n
    
    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    
    return max(dp)

时间复杂度为 $O(n^2)$。

最大子集

最大子集是指在一个数字序列中,找到一个连续的子序列,它的和最大。例如,对于序列 $[-2, 1, -3, 4, -1, 2, 1, -5, 4]$,最大子集为 $[4, -1, 2, 1]$,和为 $6$。

在计算最大子集时,一个简单的解决方案是对输入的数字序列进行遍历,每次取出一个连续的子序列,然后计算出子序列的和,最后比较得出最大的子集。

下面是 Python 代码片段,实现最大子集的计算:

def maxSubArray(nums):
    if not nums:
        return 0
    n = len(nums)
    curr_sum = max_sum = nums[0]
    
    for i in range(1, n):
        curr_sum = max(nums[i], curr_sum + nums[i])
        max_sum = max(max_sum, curr_sum)
    
    return max_sum

时间复杂度为 $O(n)$。

参考资料