(希望通过每日一题督促自己学习并练习算法)
【题目描述】
【题目链接】 https://leetcode.cn/problems/find-if-array-can-be-sorted/description/
思考
(看完之后,一头雾水)看了leetcode官方发的思路后总结:若上一个组的最大值小于当前组的值,那么无论组内经历多少次的变换都会是有序的【leetcode的判别是升序,其实更严格应该是其他的特殊排法也要能够判定】。
解答
class Solution:
def canSortArray(self, nums: List[int]) -> bool:
lastcount = 0 # 用来存储上一个元素二进制下的“1”的数目
lastgroupmax = 0 # 用来存储上一个组的最大元素
currgroupmax = 0 # 用来存储当前组的最大元素
for ele in nums:
currcount = ele.bit_count() # 获取当前元素二进制下的"1"的数目
'''
判断当前的元素是不是和上一个元素属于同一个组。
若同属一个组,则更新当前组的最大值;
否则,更新lastcount、lastgroupmax 和 currgroupmax
'''
if lastcount == currcount:
currgroupmax = max(currgroupmax, ele)
else:
lastcount = currcount
lastgroupmax = currgroupmax
currgroupmax = ele
# 若当前元素小于上一个组的max,那么则不可能被排序
# 【一定要看清楚题目!是相邻!!😀我因为没看清楚就在思考第一个Example如果变成[8,30,4,15,2],即不同“1”数目相间隔可不可能被排序,答案当然是:不能!】
if ele < lastgroupmax:
return False
return True
时间复杂度:O(n) , n为nums的长度