力扣--排序

排序(2)

十种排序算法复杂度
十种排序算法复杂度

-出现频率最高的前k个元素
力扣347
1.使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值。2.将频率作为数组下标,对于出现频率不同的数字集合,存入对应的下标。3.倒序遍历数组获取出现顺序从大到小的排列。

这里用python3实现桶排序,是自己想着写的,不是很完美,但是可以通过。

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        res = [[] for i in range(len(nums) + 1)]
        dic = {}
        for i in nums:
            dic[i] = dic.get(i, 0) + 1
        for num, times in dic.items():
            res[times].append(num)
        t = 0
        ans = []
        for i in range(len(nums), 0, -1):
            if res[i]!=[]:
                t +=len(res[i])
                ans.extend(res[i]) #  extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
                if t == k:
                    return ans

时间复杂度O(n):n表示列表的长度,首先遍历一遍,统计元素的频率,这一操作为O(n);桶排序的数量是n+1,所以为O(n)。因此,总的O(n)。
空间复杂度O(n):桶的大小。

### 插入排序 LeetCode 题目解析 #### 插入排序简介 插入排序是一种简单直观的排序算法。该算法构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入[^2]。 #### LeetCode 上的相关题目 LeetCode 提供了一个经典的插入排序题目:147. 对链表进行插入排序。这道题目的目标是对给定的单向链表节点按照升序排列,并且要求使用插入排序的方法实现这一功能。 #### Python 实现代码示例 下面是一个针对上述问题的具体解决方案: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def insertionSortList(head: ListNode) -> ListNode: if not head or not head.next: return head dummy_head = ListNode(0) dummy_head.next = head current_node = head while current_node and current_node.next: if current_node.val <= current_node.next.val: current_node = current_node.next else: insert_position = dummy_head while insert_position.next.val < current_node.next.val: insert_position = insert_position.next temp_node = current_node.next current_node.next = temp_node.next temp_node.next = insert_position.next insert_position.next = temp_node return dummy_head.next ``` 这段代码定义了 `ListNode` 类用于创建链表节点对象,并实现了 `insertionSortList` 函数来进行链表的插入排序操作。通过遍历整个链表并将每个新遇到的元素放置在其正确的位置上来完成排序过程。 #### 复杂度分析 时间复杂度为 O(n²),其中 n 是链表中的节点数量;这是因为最坏情况下需要对每一个新的元素做一次完整的线性搜索以决定其应该被插入的地方。空间复杂度为 O(1),因为除了几个辅助变量外不需要额外的空间来保存任何东西[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值