动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)

我们今天来看一道简单的动态规划内容哈。先看题目:在一个整型数组中求递增序列的长度

我们先把这道题细化一下,假设有一个整型数组, a1, a2, a3,...an, 我们需要找到一个递增序列 ai, aj, ak...使得 i

1. 递增序列是连续递增吗? 例子中的i,j,k需要连续吗?(不需要啊)

2. 我们需要把原数组划分为若干个子数组,然后求出递增序列吗?(不需要啊?只要求出长度)

3. 我们扩展一下,如果要我们求出这个递增数组,我们能做吗?(可以的哈,我们先解决当前的问题,然后我们一起讨论一下)

好了,我们继续分析这道题啊。假设我们知道了到ai为止,之前的递增序列长度,我们只需要把当前的aj与ai去比较哈,并记录住ai的递增长度加1,我们记录下来,再和a[i-1]去比对吧?当然,如果a[j] > a[i-1]我们还需要把刚在记录的长度去和a[i-1]所在的递增序列长度去比较,对吧?这样的比较到什么时候为止呢?应该是到a[0] 个元素,这样我们才能保证没有元素遗漏掉。此处,大家要注意哈,不是找到最大的元素就结束了哈。

如何记录当前元素及之前的序列中,递增序列的长度呢?核心问题是,每个元素似乎都要记录下来。那我们就想到了计数排序里的签到表。什么一个新的数组,和之前的数组长度一样,默认值都是0(此处,我们应该至少返回1哈,大家会看到我们代码的处理里加了1才能理解)。

这一题的本质,其实是一维的动态规划哈。接下来的篇章里我们会逐渐讨论动态规划(DP)的问题。我们一起来看代码:

        /// 
        /// 求最长递增子序列的长度
        /// 
        /// 
        public static int MaxIncreaseSequence(int[] array)
        {
            int maxLength = 0;

            if (array != null)
            {
                int[] dpMark = new int[array.Length];

                for (int index = 1; index < array.Length; index++)
                {
                    for (int i = index - 1; i >= 0; i--)
                    {
                        if (array[index] > array[i])
                        {
                            if (dpMark[index] < dpMark[i] + 1)
                            {
                                dpMark[index] = dpMark[i] + 1;
                            }
                        }
                    }
                }

                for (int index = 0; index < array.Length; index++)
                {
                    Console.Write(dpMark[index] + ",  "); // 这里是为了测试哈,方便我们验证结果
                    if (dpMark[index] > maxLength)
                    {
                        maxLength = dpMark[index];
                    }
                }
                return maxLength + 1;
            }

            return maxLength;
        }

接下来一起测试一下:

动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)_第1张图片

我们来验证一下哈:

1. 10 - 递增长度应该是 1, 只有一个元素啊,所以大家看到上面的结果返回0

2. 10, 100 - 递增长度应该是2, 对于100来说。 两个元素确实是递增的,所以大家看到了上面的结果返回1

3. 10, 100, 20 - 递增长度是2, 对于20来说。递增序列是10, 20. 所以大家看到了上面的结果返回1

4. 10, 100, 20, 15 - 递增长度是2, 对于15来说。递增序列是10, 15,所以大家看到上面的结果返回1

5. 10, 100, 20, 15, 20 - 递增长度是3,对于20来说。递增序列是10,15,20, 所以大家看到上面返回的结果2

6. 10, 100, 20, 15, 20, 16 - 递增长度是3. 对于16来说,递增序列是 20, 15,16,所以大家看到上面的结果返回2

大家就按照这个思路继续往下哈。相信大家能够很快理解为什么最大递增长度是7了。

好了,我们今天就讨论到这哈。关于大家关注经典面试题算法与数据结构,以及我们的链表排序专题讲解了解更多资源。

关注我们的公众号,获取定期推送。关注课程,定期会有优惠哦。

动态规划系列 - 找递增序列的长度 - 算法与数据结构面试分享(二十七)_第2张图片

你可能感兴趣的:(动态规划)