<
ARTS 第八周
>
上一篇

ARTS 第七周
下一篇

ARTS 第九周
Toc
ARTS Week-8

Algorithm

215. 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入:[3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:

输入:[3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

这道题是一道中等难度的题目,其实使用编程语言的内部的排序函数可以很简单的解决,

所以借此机会复习一下经典的两个排序算法,归并排序快速排序,挑这两个的原因是因为他们都是利用D&C(分治)的思想。

快速排序

img1

归并排序

img2

代码实现

⚠️ 注意题目中的排序是从大到小

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        #self._qsort(nums, 0, len(nums) - 1)
        nums = self._msort(nums)
        return nums[k - 1]
    
    def _qsort(self, nums, start, end):
        if start >= end:
            return

        pivot = start
        left = pivot
        right = end

        while left < right:
            while left < right and nums[right] < nums[pivot]:
                right -= 1

            while left < right and nums[left] >= nums[pivot]:
                left += 1

            nums[left], nums[right] = nums[right], nums[left]

        nums[left], nums[pivot] = nums[pivot], nums[left]

        self._qsort(nums, start, left - 1)
        self._qsort(nums, left + 1, end)
    
    def _msort(self, nums):
        """
        归并排序
        """
        length = len(nums)
        if length < 2:
            return nums
        
        mid = length // 2
        
        left = self._msort(nums[:mid])
        right = self._msort(nums[mid:])
        
        tmp = []
        while left and right:
            if left[0] > right[0]:
                tmp.append(left.pop(0))
            else:
                tmp.append(right.pop(0))
        
        if left:
            tmp += left
        else:
            tmp += right
        
        return tmp

Review

《97 Things Every Programmer Should Know》- Beauty Is in Simplicity

在开发过程中,我们要努力让自己写的代码要有:

而代码是否优雅美观是一个很主观的感受,但是美观的代码肯定是简洁的。

Beauty of style and harmony and grace and good rhythm depends on simplicity.

Tip

推荐一个手机和平板的终端工具,https://termius.com/

个人在日常生活中经常有一些代码的点子需要写下来运行一下,这时候就需要一个终端连接到我的 vps 上跑一下我的代码。

非常喜欢它的交互方式,感兴趣的可以体验一下。

Share

程序员应该怎么学数学

img3

Top
Foot