Brute Force
class Solution:
def check(self, nums: List[int]) -> bool:
""" tc O(N) sc O(1)
"""
fst = nums[0]
end = nums[-1]
brk = None
inc = True
for i in range(1,len(nums)):
if nums[i] < nums[i-1]:
if inc:
brk = nums[i-1]
inc = False
else:
return False
# not brk mean it's sorted ; end<= fst is to prove it's rotated
return True if not brk or end <= fst else False
Optimization
class Solution:
def check(self, nums: List[int]) -> bool:
""" tc O(N) sc O(1)
main idea: cnt cases where num[i-1] > num[i], since most cases will be <=. if cnt == 0, means sorted, if cnt == 1, means rotated
"""
cnt = 0
n = len(nums)
if n == 1:
return True
for i in range(1,n):
if nums[i-1] > nums[i]:
cnt += 1
if nums[-1] > nums[0]:
cnt += 1
return cnt <= 1