1752 检查数组是否经排序和轮转得到(分析)
发布日期:2021-05-07 21:57:13 浏览次数:21 分类:精选文章

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

为了解决这个问题,我们需要判断给定的数组 nums 是否可以通过轮转若干位置得到一个按非递减顺序排列的源数组。

方法思路

我们可以通过以下步骤来解决这个问题:

  • 问题分析

    • 源数组是一个按非递减顺序排列的数组。
    • 我们需要判断 nums 是否可以通过轮转得到这个源数组。
  • 关键观察

    • 如果 nums 数组是一个非递减数组,那么它可以直接作为源数组,返回 true
    • 如果 nums 数组中存在多个降序片段(即多个相邻元素后一个小于前一个),那么它不能通过轮转得到源数组,返回 false
    • 如果 nums 数组中存在一个降序片段,并且最后一个元素小于等于第一个元素,那么它可以通过轮转得到源数组,返回 true
  • 算法选择

    • 遍历数组,统计降序片段的数量。
    • 如果降序片段数量超过1,返回 false
    • 如果降序片段数量为0,返回 true
    • 如果降序片段数量为1,并且最后一个元素小于等于第一个元素,返回 true
  • 解决代码

    from typing import List
    class Solution:
    def check(self, nums: List[int]) -> bool:
    count = 0
    for i in range(len(nums) - 1):
    if nums[i] > nums[i + 1]:
    count += 1
    if count > 1:
    return False
    return count == 0 or nums[-1] <= nums[0]

    代码解释

    • 初始化变量count 用于统计降序片段的数量。
    • 遍历数组:从第一个元素开始,比较每个元素和下一个元素。如果当前元素大于下一个元素,说明存在一个降序片段,count 增加。
    • 检查降序片段数量:如果 count 超过1,立即返回 false
    • 返回结果:如果 count 为0,说明数组是非递减的,返回 true。如果 count 为1,并且最后一个元素小于等于第一个元素,返回 true。否则,返回 false

    这个方法通过一次遍历数组,时间复杂度为 O(n),其中 n 是数组的长度,能够高效地解决问题。

    上一篇:1753 移除石子的最大得分(贪心)
    下一篇:牛客-acwing刷题链接

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月06日 23时21分25秒