好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作。

找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以我打算将数组按逆序排序,选择算法方面,一开始打算使用大顶堆的堆排序,可是想了下,快排的性能会更好一点,所以就采用快排了

具体思路如下:

  由于一开始为了让空间复杂度为O(1),所以踩了不少坑,最坑的就是找到中间位置,又要让比中间元素小的放在左边,又不打算移动中间位置,直接就崩了。。。惨惨惨。

  言归正传:

  1. 首先明确一点就是快排使用递归操作

  2. 其次利用三元法确定pivot,即元素的界,值小于pivot放在右侧,大于pivot的但在左侧

  3. 根据k的大小确定递归哪一侧

具体程序如下:

 package algorithm;

 public class QuickSort {

     public int findKthLargest(int[] nums, int k){
if(nums.length < k){
return 0;
}
quickSort(nums,0,nums.length-1,k); return nums[k-1];
} private void quickSort(int[] nums,int left,int right,int k){ int center = (left+right)/2;
if(left >= right){
return;
}
int pivot = chosePivot(nums,left,right,center); int i = left+1;
int j= right-1;
while (i < j){
while (nums[i++] >= nums[center] && i < center){
i++;
}
while (nums[j--] < nums[center] && j > center){
j--;
} if(nums[i] <= pivot && pivot <= nums[j]){
swap(nums,i,j);
if(i == center){
center = j;
}else if(j == center){
center = i;
}
}
}
if(k <= center){
quickSort(nums,left,center,k);
}else if(k > center){
quickSort(nums,center+1,right,k);
} } private int chosePivot(int[] nums,int left,int right,int center){
if(nums[right] > nums[center]){
swap(nums,right,center); }
if(nums[left] < nums[right]){
swap(nums,left,right); } if(nums[left] < nums[center]){
swap(nums,left,center);
} return nums[center]; } private void swap(int[] nums,int left,int right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
} public static void main(String[] args){
int[] nums = new int[]{3,2,1,5,6,4}; QuickSort sort = new QuickSort(); System.out.println(sort.findKthLargest(nums,2));
for (int i: nums){
System.out.print(i);
}
} }

后续会在继续考虑优化问题,展示先这样了

LeetCode 腾讯精选50题--数组中的第K个最大元素的更多相关文章

  1. LeetCode 腾讯精选50题--二叉树中的最大路径和

    二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...

  2. LeetCode 腾讯精选50题--求众数

    由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...

  3. LeetCode 腾讯精选50题--只出现一次数字

    事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...

  4. LeetCode 腾讯精选50题--子集

    根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...

  5. LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

    贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...

  6. LeetCode 腾讯精选50题--最小栈

    题目很简单,实现一个最小栈,能够以线形的时间获取栈中元素的最小值 自己的思路如下: 利用数组,以及两个变量, last用于记录栈顶元素的位置,min用于记录栈中元素的最小值: 每一次push,都比较m ...

  7. LeetCode 腾讯精选50题--2的幂

    在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...

  8. LeetCode 腾讯精选50题--合并K个排序链表

    今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的: 1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作, 2.其次是多个链表的合并,所以在第一步实现的基础上 ...

  9. LeetCode 腾讯精选50题--有效的括号

    根据题意,第一反应就是使用栈,左右括号相匹配,则将左括号出栈,否则将左括号入栈. 这里我用数组配合“指针”模拟栈的入栈与出栈操作,初始时指针位置指向0,表示空栈,凡遇上左括号则直接入栈,若遇上有括号, ...

随机推荐

  1. 2018网特招新题writeup

    沈永宁(周鸣振)这狗比,晚上才发现他隐姓埋名偷偷刷了分还刷到了第一名,不行我也刷...我刷刷刷

  2. IDEA类和方法注释模板设置(非常详细)

    一.首先我们来设置IDEA中类的模板:(IDEA中在创建类时会自动给添加注释) 1.File-->settings-->Editor-->File and Code Template ...

  3. ceph报错

    [ceph_deploy.mon][ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different conten ...

  4. SpringMVC中实现Bean Validation(JSR 303 JSR 349 JSR 380)

    JSR 303是针对bean数据校验提出的一个规范.使用注解方式实现数据校验. 每个注解的用法这里就不多介绍,请移步JSR 303 - Bean Validation 介绍及最佳实践 笔者上面提到的J ...

  5. CentOS8 安装 simple-scan 的方法

    CentOS8删除了很多软件包,解决的思路一般是从CentOS7或EPEL7的软件仓库中寻找,并解决依赖关系. 比如找到EPEL7中有 simple-scan 软件包,但安装时发现其又依赖 gnome ...

  6. 如何使用QTP12 UFT做功能性测试(转载)

    首先,按照本博客的安装教程走的,右键管理员运行 接下来点击继续,这个界面只需要勾选到web即可 点击ok,开始运行 进入到主界面之后,file新建一个测试. 可以修改路径等等 点击create之后,出 ...

  7. python3 速查参考- python基础 9 -> MySQL基础概念、数据库create、alter、insert、update、delete、select等基础命令

    前置步骤: 下载一个绿色版的mysql数据库客户端连接工具 :http://wosn.net/821.html mysql平台为win7(以后会有CentOS上的) 学习目的: 掌握数据库的基本概念, ...

  8. python-Web-django-商城-购物车商品加减

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. python-Web-django-路由保护

    from django.shortcuts import redirect,HttpResponse from app01.models import * import re def ddff(mod ...

  10. zebra 配置问题导致服务起不来

    由于配置错误的原因,导致 zebra 起不来,具体报错如下: zebra 起不来,导致 ospf 也起不来,报错如下: Job ospfd.service/start failed with resu ...