DataWhale九月组队学习之LeetCode2

作业5:

考虑到最终结果可能会超过int得上限,不能用整数来存储拼接值,这里考虑用字符串来处理。以分治思想考察,多个num相互拼接,本质上可以等价于两个num相互拼接,哪个大哪个放前边,所以就类似排序思想。排序时也可以使用sort自带函数排序,但是并不能减小时间复杂度。

可以使用双指针的方法来解决,一个指针从数组的开头开始,另一个指针从数组的末尾开始。当第一个指针遇到非零元素时,将其与第二个指针所指向的元素交换,然后第二个指针向前移动一位。重复这个过程,直到第一个指针到达数组的末尾。

使用 Python 的内置函数 sorted() 来对数组进行升序排列。

Python 的内置函数 sorted() 采用了 Timsort 排序算法。Timsort 是一种自适应、稳定的排序算法,结合了归并排序和插入排序的特点。

在处理已经部分排序的数据时,Timsort 具有 O(n) 的时间复杂度,能够高效地完成任务。而在处理无序数据时,Timsort 的时间复杂度为 O(n log n)。在对大型数据集进行排序时,有较好的性能。

作业6:

通过创建字典,将得分作为键,将名次作为值。将字典按键(得分)降序排序,遍历排序后的字典,给每个名次分配相应的奖项。

合并两个已排序数组的问题,可以使用双指针法,分别从nums1和nums2的末尾向前遍历,将较大的数依次放在nums1的尾部,这样可以避免因元素移动而覆盖已有元素。

在归并排序过程中,两个子数组被合并成一个有序数组。在这个过程中,可以统计逆序对的数量merge_and_count 是一个帮助函数,它负责合并两个子数组并计算逆序对的数量。当右子数组中的当前元素小于左子数组中的当前元素时,当有 len(left) - i 个逆序对,因为左子数组中的剩余元素都会大于右子数组中的当前元素。merge_sort 是递归函数,它将数组分成两半,然后分别对两半进行排序并计算逆序对的数量。调用 merge_and_count 来合并两个有序的子数组并计算逆序对的数量。最后,调用 merge_sort 函数来计算数组中的逆序对的数量。

作业7:

可以借鉴使用荷兰国旗问题的解决方法,也称为三向切分快速排序。首先将数组分为三个部分:0、1和2。然后对每个部分进行排序,最后将它们合并在一起,这个算法的时间复杂度为 O(n),空间复杂度为 O(1)。

可以使用快速选择算法解决,快速选择算法是快速排序算法的一种变种,它可以在平均时间复杂度为O(n)的情况下找到数组中第k个最大的元素。基本思想是选择一个基准元素,将数组分为两部分,一部分是小于基准元素的,另一部分是大于基准元素的。然后根据k和基准元素的位置关系,确定第k个最大元素在哪个部分中,然后在该部分中继续进行快速选择。

首先对数组进行排序,从小到大排序。然后从排序后的数组中取前k个元素,即为最小的k个数。

作业8:

采用非递归二分查找函数,提高查找效率,使用二分查找前需要对列表进行排序(二分查找使用的前提是数据必须通过顺序表存储且数据必须有序)。

这是一个双指针问题,可以使用两个指针 i 和 j,分别从数组的头部和尾部开始遍历。对于每个 i,检查是否存在一个满足条件的 j。如果存在,返回 true;否则,继续移动指针。

可以使用桶排序的思想来解决,需要找到数组中的最大值和最小值,然后创建一个大小为最大值和最小值差值加1的桶数组。遍历原数组,将每个元素放入对应的桶中。最后,计算相邻桶之间的最大差值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不跑那我跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值