排序-把数组排成最小的数,堆,快速排序,内置sort

硬知识

sort函数结合functools.cmp_to_key(func)
sorted函数详解(高级篇)
小顶堆内置heapq模块
堆heapq模块

快速排序在选择大于标准和小于标准方面,有两个方法
ij交换
ij轮流赋值代码

剑指 Offer 45. 把数组排成最小的数

这题学到如何改变比较函数、快速排序写法
快速排序一定要想清楚,为什么最后将第一个元素赋给low是成立的
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

给你来个元素x和y,怎么知道谁在前谁在后?
比一下就知道了,xy 和 yx哪个大。
在这里插入图片描述

使用快排或内置函数
在这里插入图片描述

快速排序:
内置函数:

class Solution:
    def minNumber(self, nums: List[int]) -> str:
        def quick_sort(l , r):
            if l >= r: return # 只有一个元素 不需比较
            i, j = l, r
            while i < j: 
                while strs[j] + strs[l] >= strs[l] + strs[j] and i < j: j -= 1
                while strs[i] + strs[l] <= strs[l] + strs[i] and i < j: i += 1
                strs[i], strs[j] = strs[j], strs[i]
            strs[i], strs[l] = strs[l], strs[i] # 结束时i=j,与第一个元素交换
            quick_sort(l, i - 1)
            quick_sort(i + 1, r)
        
        strs = [str(num) for num in nums]
        quick_sort(0, len(strs) - 1)
        return ''.join(strs)

# nums = list(map(str,nums))
from functools import cmp_to_key
class Solution:
    def minNumber(self, nums: List[int]) -> str:
        def sort_rule(x, y):
            a, b = x + y, y + x
            if a > b: return 1 # 注意这是升序
            elif a < b: return -1
            else: return 0
        
        # strs = [str(num) for num in nums]
        strs = list(map(str,nums))
        strs.sort(key = cmp_to_key(sort_rule))
        return ''.join(strs)

# 另外一种快速排序
class Solution:
    def minNumber(self, nums: List[int]) -> str:
        def quick_sort(l , r):
            if l >= r: return # 只有一个元素 不需比较
            i, j = l, r
            part = strs[l]
            while i < j: 
                while strs[j] + part >= part + strs[j] and i < j: j -= 1
                strs[i] = strs[j]
                while strs[i] + part < part + strs[i] and i < j: i += 1
                strs[j] = strs[i]
            strs[i] = part # 结束时i=j,与第一个元素交换
            quick_sort(l, i - 1)
            quick_sort(i + 1, r)
        
        strs = [str(num) for num in nums]
        quick_sort(0, len(strs) - 1)
        return ''.join(strs)

剑指 Offer 61. 扑克牌中的顺子

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。 A 不能视为 14。

难度: 5张牌是顺子的 充分条件
在这里插入图片描述
在这里插入图片描述

直接看了答案。。。

class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        repeat = set()
        ma, mi = 0, 14
        # ma, mi = max(nums), min(nums) #错误 要排除大小王,即0
        for num in nums:
            if num == 0: continue # 跳过大小王
            ma = max(ma, num) # 最大牌
            mi = min(mi, num) # 最小牌
            if num in repeat: return False # 若有重复,提前返回 false
            repeat.add(num) # 添加牌至 Set
        return ma - mi < 5 # 最大牌 - 最小牌 < 5 则可构成顺子 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值