算法# 学习目标:排序算法(二)
学习内容:
排序算法:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法
学习产出:
排序算法的变种
选择排序
LeetCode 215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
快速选择一般用于求解第K个元素,可以在O(n)时间复杂度,O(1)空间复杂度,与快速排序相似,只需找出第k大的元素即可,无需对左右进行排序
代码(python)
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
def quickselection(nums: List[int], l: int, r: int): #快速选择函数
i,j = l+1,r
while True:
while i < r and nums[i] <= nums[l]:
i+=1
while l < j and nums[j] >= nums[l]:
j-=1
if i >= j: break
nums[i],nums[j]=nums[j],nums[i]
nums[l],nums[j]=nums[j],nums[l]
return j
l,r,target = 0,len(nums)-1,len(nums)-k
while l < r:
mid = quickselection(nums,l,r)
if mid == target: return nums[mid]
elif mid < target:
l = mid + 1
else:
r = mid - 1
return nums[l]
注:python内置函数sort会得到更为简单的方法
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
nums.sort()
return nums[-k]
桶排序
LeetCode 347 前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
桶排序,为每个值设立一个桶,桶内记录这个值出现次数,然后对桶进行排序。在python中,就能用字典的形式来作为记录次数的桶。
代码(python)
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
map = {}
for i in nums:
map[i] = map.get(i,0) + 1 #生成字典映射
max_time = max(map.values())
TongList = [[] for i in range(max_time+1)] #根据最大次数生成桶
for key, value in map.items():
TongList[value].append(key) #将索引value放入key对应的字典索引
res = []
for i in range(max_time, 0, -1): #按桶索引排序
if TongList[i]:
res.extend(TongList[i])
if len(res) >= k:
return res[:k]
注:python字典运用
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
dict = collections.defaultdict(int)#默认字典
b = []
for w in nums: #统计list元素出现次数 {元素:次数}
dict[w]+=1
a=sorted(dict.items(),key=lambda x:x[1],reverse=True)[:k] #对次数排序,取出前k个最频繁的数字
for i in a:
b.append(i[0])
return b