Sort
贪心是一种思想,使用贪心思想解决的问题,如果能被总结成具体某一类问题,那么就有具体的名字,比如单源最短路问题,最小生成树问题,拓扑排序问题,如果不能被总结出来,那它就叫贪心问题哈哈。
贪心问题经常需要借助排序来实现。
快速排序
- 取一个随机值作为下标,与最后一个位置交换
- small始终指向最后一个小于pivot的下标,初始为start - 1
- 从start开始遍历,不需要遍历最后一个数(特殊处理)
- 当nums[i] < nums[end],将small前移,并且交换i与small
- 退出循环后,将small前移,与最后一个位置的数(pivot)交换
代码
1 | |
计数排序
计数排序是一种线性时间的整数排序算法。如果数组的长度为n,整数范围(数组中最大整数与最小整数的差值)为k对于k远小于n的场景(如对某公司所有员工的年龄排序),那么计数排序的时间复杂度优于其他基于比较的排序算法(如归并排序、快速排序),
三次遍历!
- 遍历原始数组
nums,得出最大值max与最小值min,并创建大小为max - min + 1的count数组 - 遍历
nums数组,把对应整数num出现的次数记录在count数组的count[num - min]中 - 令
num从min遍历到max,将num顺序填入nums中(每个num有count[num - min]个)
代码
1 | |
剑指 Offer II 074. 合并区间

方法一:射气球的思路
首先将数组按照左边界升序排序
当intervals[i][1] >= intervals[j][0],那么这两个元素一定是要合并的,因为是intervals数组是按照左边界升序排序的,那么合并区间[a, b]的a一定是intervals[i][0],将intervals[i][1]赋值为intervals[i][1]与intervals[j][1]的最大值
当intervals[i][1] < intervals[j][0],那么这个两个区间是不重合的,先把上一个重合区间加入结果集,再把j赋值给i,进行下一轮循环
当j == intervals.length - 1时候,
- 如果intervals[i][1] >= intervals[j][0],那么会将intervals[i][1]取intervals[i][1]与intervals[j][1]的最大值
- 如果intervals[i][1] < intervals[j][0],那么会将之前的重合区间存入结果集,并将j赋值给i
所以出循环,只需要把intervals[i]加入结果集就好!
1 | |

剑指 Offer II 075. 数组相对排序

- 数据范围是[0, 1000],创建大小为1001的
count数组 - 统计
arr1中出现整数的个数 - 按照
arr2整数出现的顺序填arr1数组 - 从0到1000(升序),把剩下的数组填入
arr1数组
1 | |

剑指 Offer II 076. 数组中的第 k 大的数字

快排找到下标为n-k的数x,左边的数都小于x,右边的数都大于x
1 | |

Sort
https://leopol1d.github.io/2023/06/12/sort/