【Leetcode每日一题(Days1)】3011. Find if Array Can Be Sorted

(希望通过每日一题督促自己学习并练习算法)

【题目描述】

在这里插入图片描述
【题目链接】 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的长度

Finish.

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值