leetcode快排相关
leetcode:75颜色分类(3way)、215数组中的第K个最大元素(normal)
3way
private static void quick3waySort(int[] arr, int left, int hi) {
if (lo >= hi) return; // 注意大于等于
int mid = left + (right - left) / 2;
swap(arr, lo, mid);
int val = arr[lo];
// lt表示等于val的,lt-1才是小于val的位置
// gt表示还没比较的位置,但gt+1就是大于val的
int lt = lo, gt = hi;
int i = lo + 1;
while (i <= gt) {
if (arr[i] < val) swap(arr, lt++, i++); // nums[i] == 0 颜色分类
else if (arr[i] > val) swap(arr, i, gt--); // nums[p] == 2 颜色分类
else i++;
}
quick3waySort(arr, lo, lt - 1);
quick3waySort(arr, gt + 1, hi);
}
normal
注意这里用for循环!!!
public int findKthLargest(int[] nums, int k) {
// 左右指针,调整k
int left = 0, right = nums.length - 1, n = nums.length - k, rank = 0;
// 遍历,下面写法与二分查找十分相像
while (right >= left){
// 比较partition结果调整指针
rank = partition(nums, left, right);
if (rank < n){
left = rank + 1;
} else if (rank > n){
right = rank - 1;
} else {
break;
}
}
return nums[rank];
}
// partition函数
private int partition(int[] nums, int left, int right){
// 设置mid,保存mid值pivot,lt指针
int mid = left + (right - left) / 2, val = nums[mid], lt = left;
// 交换mid与right
swap(nums, mid, right);
// 遍历
for (int i = left; i < right; i++){
// 如果小于pivot,就掉到前面,lt++
if (nums[i] < val){
swap(nums, lt, i);
lt++;
}
}
// 交换pivot和lt
swap(nums, lt, right);
// 返回lt
return lt;
}
leetcode快排相关的更多相关文章
- 待字闺中之快排单向链表;leetcode之Sort List
题目来源.待字闺中.原创@陈利人 .欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的高速排序一样,都须要找到一个pivot元素.或者节点. 然后将数组或者单向链表划分为 ...
- LeetCode 75. Sort Colors (颜色分类):三路快排
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...
- leetcode 75 Sort Colors 计数排序,三路快排
解法一:计数排序:统计0,1,2 的个数 时间复杂度:O(n) 空间复杂度:O(k) k为元素的取值范围, 此题为O(1) class Solution { public: void sortC ...
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- [剑指Offer]39-数组中出现次数超过一半的数字(快排延申,找第k大数同理)
题目链接 https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&t ...
- 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...
- Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案
要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...
- 【PHP数据结构】交换排序:冒泡、快排
上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排, ...
随机推荐
- Java排序算法全
目录 Java排序算法代码 零. 排序基类 一. 选择排序 二. 插入排序 三. 希尔排序 四. 归并排序 1. 自顶向下 2. 自底向上 五. 快速排序 1. 基本版 2. 双路切分版 3. 三路切 ...
- 一个简单的java年龄计算器
制作一个如下图年龄计算器 根据题目,我做了一个由Calendar类以及年月日各相减得到的年龄,当然正确的方法不止一个,以下为我的源代码和结果截图: package com.Date; import j ...
- mysql如何将一个字段多个类型串成一个字符串?
结论 先说结论,可以使用group_concat group by的组合实现多行变一行,将一个字段的多个类型串成一个字段 需求: 如题,一个字段如电影类别,一部电影可以是多个类别,如喜剧.动作片等,其 ...
- (C/C++学习)23.C++中指针的长度
引言:先看下面一个程序会打印出什么? #include<iostream> using namespace std; int main() { int a = 2; int *p = &a ...
- 这几道Java集合框架面试题在面试中几乎必问
Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylis ...
- buf.readUInt16BE()
buf.readUInt16BE(offset[, noAssert]) buf.readUInt16LE(offset[, noAssert]) offset {Number} 0 <= of ...
- 文件内容差异对比-python
上次没精力时候,看了下python自动化运维,给print加了颜色,新鲜哒 今天来写写文件对比 step1:引入difflib库(无需安装,python自带) step2:将文件内容按行分割,spli ...
- 类中的普通方法伪装成属性 @property
class P: def __init__(self,name,age): self.name=name if type(age) is int: self.__age=age else: print ...
- rm -rf & node
rm -rf & node rm -rf $ rm -rf mydir https://www.computerhope.com/issues/ch000798.htm https://sta ...
- POJ 2065 高斯消元求解问题
题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...