[每日一题] 3. 排序子序列--编程题(贪心+模拟+思维)
发布日期:2021-05-12 23:13:42 浏览次数:23 分类:精选文章

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

为了解决这个问题,我们需要将一个整数数组分成若干段排序子序列,其中每个子序列要么是非递减的,要么是非递增的。我们的目标是找到最少的段数。

方法思路

我们可以通过遍历数组并动态地确定每个段的状态来解决这个问题。具体步骤如下:

  • 初始化:读取输入,扩展数组以处理边界情况。
  • 遍历数组:从左到右遍历数组,检查当前元素与下一个元素的关系。
  • 判断趋势:如果当前元素小于下一个元素,进入递增段;如果相等,继续当前段;否则,进入递减段。
  • 分割段:每当趋势发生变化时,结束当前段并开始新段,计数器加一。
  • 这种方法确保每次分割都是在趋势变化的地方,保证每段都是递增或递减的,从而最少分割。

    解决代码

    n = int(input())
    a = list(map(int, input().split()))
    a.append(0) # 扩展数组到n+1长度
    count = 0
    i = 0
    while i < n:
    if a[i] < a[i+1]:
    # 非递减序列
    while i < n-1 and a[i] <= a[i+1]:
    i += 1
    count += 1
    elif a[i] == a[i+1]:
    i += 1
    else:
    # 非递增序列
    while i < n-1 and a[i] >= a[i+1]:
    i += 1
    count += 1
    if i >= n:
    break
    print(count)

    代码解释

  • 输入处理:读取数组长度和数组元素,并将数组扩展到长度n+1,以便处理边界情况。
  • 遍历数组:从头开始遍历数组,检查每个元素与下一个元素的关系。
  • 递增段处理:当遇到递增趋势时,继续扩展当前段,直到趋势改变,结束段并计数。
  • 递减段处理:当遇到递减趋势时,继续扩展当前段,直到趋势改变,结束段并计数。
  • 继续处理:如果当前元素与下一个元素相等,继续当前段。
  • 这种方法确保了每段都是递增或递减的,从而最少分割,保证了算法的正确性和效率。

    上一篇:[每日一题] 4. 倒置字符串(字符串、OJ技巧)
    下一篇:[每日一题] 2. 删除公共字符---编程题(模拟、字符串、哈希表)

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年05月17日 09时46分46秒