1356. 根据数字二进制下 1 的数目排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
思路其实很简单,就是更改一下快排的判断条件,但是在题解里看到了一个很牛的位运算判断二进制1的数量
def bitcnt(num):
cnt = 0
while num:
num &= num -1
cnt += 1
return cnt
整体代码
class Solution:
def sortByBits(self, arr: List[int]) -> List[int]:
def bitcnt(num):
cnt = 0
while num:
num &= num -1
cnt += 1
return cnt
def quicksort(List):
if len(List)>= 2:
left,right = list(),list()
mid = List[len(List)//2]
mid_bitcnt = bitcnt(mid)
List.remove(mid)
for _ in List:
if bitcnt(_)>mid_bitcnt:
right.append(_)
elif bitcnt(_) == mid_bitcnt:
if _>mid:
right.append(_)
else:
left.append(_)
else:
left.append(_)
return quicksort(left)+[mid]+quicksort(right)
else:
return List
return quicksort(arr)
时间复杂度O(nlogn)
在整体的运行速度排名不高,主要是因为python大家都直接用了官方排序sort,会比自己写的算法速度更快。
空间复杂度(logn)