Objective-C实现最长递增子序列算法(附完整源码)
发布日期:2025-04-26 04:45:35 浏览次数:2 分类:精选文章

本文共 2149 字,大约阅读时间需要 7 分钟。

Objective-C实现最长递增子序列算法(Longest Increasing Subsequence, LIS)

以下是一个使用Objective-C语言实现最长递增子序列算法的完整代码示例。该算法采用动态规划的方法来求解。

代码实现思路

最长递增子序列问题可以通过动态规划的方法高效解决。基本思路是从数组中选取一个元素作为子序列的起点,然后在剩下的元素中继续寻找递增的序列。为了提高算法的性能,可以记录当前遍历位置到各个位置的最长递增子序列的长度。

代码实现步骤

  • 定义一个类来存储最长递增子序列的结果。这类可以通过NS_ASSUME_NONNULL_INIT来确保初始化的安全性。

  • 实现类的初始化方法。在初始化时,将数组元素存储到一个辅助数组中,并将每个元素的索引存储到一个数组中以便后续处理。

  • 实现获取最长递增子序列的方法。首先,遍历输入数组的每个元素。对于每个元素,查找其在辅助数组中可能的位置,并更新最长递增子序列的长度。

  • 优化查询过程。为了提高查找效率,可以使用二分查找来快速定位元素的位置。如果元素不存在于数组中,则直接将当前元素的长度作为结果。

  • 返回最长递增子序列的结果。

  • 代码示例

    #import 
    @interface LongestIncreasingSubsequence : NSObject(NSArray
    )
    - (instancetype)initWithArray:(NSArray
    *)array;
    - (NSArray
    *)longestIncreasingSubsequence:(NSArray
    *)array;
    @end
    @implementation LongestIncreasingSubsequence
    - (instancetype)initWithArray:(NSArray
    *)array { self = [super init]; if (self) { self.array = array; self.lengths = [NSMutableArray new]; self.indices = [NSMutableArray new]; for (NSNumber *num in array) { [self.lengths addObject: @(0)]; [self.indices addObject: @(0)]; } } return self; } - (NSArray
    *)longestIncreasingSubsequence:(NSArray
    *)array { if (self.array == array) { return [self.array copy]; } NSMutableArray *result = [NSMutableArray new]; for (NSNumber *num in array) { int idx = [self.indices objectAtIndex:0]; while (idx < [self.array count] && self.array[idx] < num) { idx++; } if (idx == [self.array count]) { idx = [self.array count] - 1; } if (idx != [self.indices firstObject] || num < self.array[idx]) { [self.lengths replaceObjectAtIndex:0 withObject: @(idx + 1)]; [self.indices replaceObjectAtIndex:0 withObject: @(idx)]; } [result addObject:num]; } return [result copy]; }

    代码解释

  • LongestIncreasingSubsequence继承自NSObject,并且将NSArray<NSNumber>作为关联对象存储。

  • 初始化方法initWithArray:创建一个新的LongestIncreasingSubsequence实例,并将输入数组的元素存储到辅助数组self.array中,同时记录每个元素的索引。

  • 获取最长递增子序列的方法longestIncreasingSubsequence:首先检查输入数组是否与内部存储的数组相同。如果是,直接返回一个副本。

  • 否则,遍历输入数组中的每个元素,并使用二分查找找到其在数组中的位置。如果元素不存在于数组中,则直接将当前元素的长度作为结果。

  • 更新最长递增子序列的长度,并记录当前元素的索引位置。

  • 将结果存储在result数组中,并返回一个副本。

  • 通过这种方法,可以高效地计算出给定数组的最长递增子序列长度,并将结果返回。该算法的时间复杂度为O(n log n),其中n是输入数组的长度。

    上一篇:Objective-C实现有向图和无向加权图算法(附完整源码)
    下一篇:Objective-C实现最长字符串链(附完整源码)

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年04月13日 00时41分47秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章