1752.检查数组是否经排序和轮转得到
题目描述
给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但 按非递减顺序排列。nums 中的元素可能会被轮转(向左移动)若干次。
思路:遍历
- 时间复杂度:O(n)
- 空间复杂度:O(1)
有序数组经过旋转得到的数组的性质
- 旋转后的数组中,最多只有一个逆序对(这道题是前一个元素大于后一个元素)。
- 旋转后的数组的第一个元素和最后一个元素可以抽象成相邻的,也需要判断是否逆序
代码
class Solution:
def check(self, nums: List[int]) -> bool:
inversion_cnt = 0 if nums[0] >= nums[-1] else 1
for i in range(len(nums) - 1):
if nums[i] > nums[i+1]:
inversion_cnt += 1
if inversion_cnt > 1:
return False
return True
更优雅的解法
import itertools
class Solution:
def check(self, nums: List[int]) -> bool:
is_sorted = nums[0] >= nums[-1]
for x,y in pairwise(nums):
if x > y:
if not is_sorted:
return False
is_sorted = False
return True