
[每日一题] 3. 排序子序列--编程题(贪心+模拟+思维)
初始化:读取输入,扩展数组以处理边界情况。 遍历数组:从左到右遍历数组,检查当前元素与下一个元素的关系。 判断趋势:如果当前元素小于下一个元素,进入递增段;如果相等,继续当前段;否则,进入递减段。 分割段:每当趋势发生变化时,结束当前段并开始新段,计数器加一。 输入处理:读取数组长度和数组元素,并将数组扩展到长度n+1,以便处理边界情况。 遍历数组:从头开始遍历数组,检查每个元素与下一个元素的关系。 递增段处理:当遇到递增趋势时,继续扩展当前段,直到趋势改变,结束段并计数。 递减段处理:当遇到递减趋势时,继续扩展当前段,直到趋势改变,结束段并计数。 继续处理:如果当前元素与下一个元素相等,继续当前段。
发布日期:2021-05-12 23:13:42
浏览次数:23
分类:精选文章
本文共 921 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要将一个整数数组分成若干段排序子序列,其中每个子序列要么是非递减的,要么是非递增的。我们的目标是找到最少的段数。
方法思路
我们可以通过遍历数组并动态地确定每个段的状态来解决这个问题。具体步骤如下:
这种方法确保每次分割都是在趋势变化的地方,保证每段都是递增或递减的,从而最少分割。
解决代码
n = int(input())a = list(map(int, input().split()))a.append(0) # 扩展数组到n+1长度count = 0i = 0while 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: breakprint(count)
代码解释
这种方法确保了每段都是递增或递减的,从而最少分割,保证了算法的正确性和效率。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月17日 09时46分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
minio多用户权限管控
2025-04-14
MinIO客户端mc使用
2025-04-14
Minio文件存储快速入门
2025-04-14
MinIO生成带签名的文件下载链接
2025-04-14
MinIO的分布式系统是如何确保数据一致性的?
2025-04-14
miniUI ExcelExport导出JAVA实现
2025-04-14
miniUI mini-monthpicker ie8兼容性问题
2025-04-14
MiniUI treeGrid 树节点展开和不展开的性能差别很大
2025-04-14
Mint-Ui 时间组件,比较时间
2025-04-14
Mint-UI中Invalid prop: type check failed for prop "value". Expected String, got Array.解决方案
2025-04-14
Min_25筛
2025-04-14
MIPS广告牌发布节目后显示未下载,节目发布不成功
2025-04-14
Mirantis OpenStack fuel 物理机部署
2025-04-14
MIT-JOS系列6:用户环境(二)
2025-04-14
MIT研制出空陆自动切换型无人机技术,构想多年的“飞行车”或将实
2025-04-14