在未排序的数组中找到第 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 ≤ 数组的长度。

上面算法题:

我的解答:

 public static int findKthLargest(int[] nums, int k) {
if (nums ==null) {
return 0;
}
if (k <1) {
return -1;
}
int len = nums.length;
int temp;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (nums[i] < nums[j]) {
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
if (i == k) {
break;
}
}
return nums[k -1];
}

基本思路

冒泡排序,可以得到最大值,那么第k 大,就是排序排到k次就结束,就可以了。

网上最快的解答:

    public static int findKthLargest(int[] nums, int k) {

        int left=0,right=nums.length-1;
while(left<right){
int pivot = partition(nums, left,right);
if(pivot ==k-1) {
return nums[pivot];
} else if(pivot>k-1){
right=pivot-1;
} else {
left=pivot+1;
}
}
return nums[left];
}
private static int partition(int[] nums,int left,int right) {
//先获取三个数的中位数
int pivot = median3(nums,left,right);
//int pivot = nums[left]; int start=left,end=right-1;
while(start<end) {
//从pivot左边找起,停在第一个比pivot小的地方,等待交换
while(nums[++start]>pivot) {}
//从pivot右边朝气,停在第一个比pivot大的地方,等待交换
while(nums[--end]<pivot) {}
if(start<end) {
swap(nums,start,end);
}
}
//此时,交换start与pivot
swap(nums,start, right-1);
return start;
} private static int median3(int[] nums,int left, int right){
int median=(left+right)/2;
if(nums[left]<nums[median]) {
swap(nums, left, median);
}
if(nums[left]<nums[right]) {
swap(nums,left, right);
}
if(nums[median]<nums[right]) {
swap(nums, median, right);
}
swap(nums, median, right-1);
return nums[right-1]; } private static void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}

写的有些复杂,大概是这样的思路。

二分一下,然后把最大的放在左边,中间,右边最小。然后把中间的数字,放在最右边的前一个位置。

然后从左边开始,找到比中间位置大的数字,和比中间位置小的他们两个换下位置。最后,比中间位置下的数字,和中间位置换下。

总体结果下来,就是,可以得到第n 大的数字。

如果说这个数字刚好是你要的第k 大,那么就返回。如果比你要的小,那么右边减一,把左边的数字排序,得出第k 大。如果比你要的大,k > n ,那么右边的数组去做上述的模糊排序。然后取值。

分析

上面第二个算法,确实在命中你的要求的话,确实很快,但是不好理解。有些复杂,一些基础的程序员可能理解起来比较困难,
上面冒泡,理解起来简单,但是排序的次数,k 越大,次数越多。算法时间复杂度是O(n^2)

总结:

自己找一份工作,确实没有什么难的。但是找一份薪资报酬,条件高的公司,确实还需要继续努力。需要巩固的知识,还有很多。加油吧,不要止步不前。

算法-----数组------ 数组中的第K个最大元素的更多相关文章

  1. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

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

    1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  3. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  4. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

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

    215. 数组中的第K个最大元素 问题描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 示例 1: 输入: [3 ...

  6. 215 Kth Largest Element in an Array 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,它是数组有序排列后的第 k 个最大元素,而不是第 k 个不同元素.例如,给出 [3,2,1,5,6,4] 和 k = 2,返回 5.注意事项:你可以假 ...

  7. Leetcode 215.数组中的第k个最大元素

    数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...

  8. Leetcode题目215.数组中的第K个最大元素(中等)

    题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  9. Java实现 LeetCode 215. 数组中的第K个最大元素

    215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...

  10. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

随机推荐

  1. 十天精通CSS3

    课程地址:http://www.imooc.com/learn/33 第1章 初识CSS3 CSS3课程列出第一站,先带领大家进入CSS3的世界,探索CSS3的魅力! 你做好准备了吗? 第2章 边框 ...

  2. csu 1947 三分

    题意: 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上6点40醒来后发现自己变成了一名高中生,这时马上就要做早操了,小明连忙爬起来 他看到操场密密麻麻的人,突然灵光一闪想到了 ...

  3. ABP问题记录

    按照<Asp.NET Core2.0与 EF的ABP框架入门视频教程>(https://ke.qq.com/course/287301)下载了3.9版本的ABP,开始学习,下面记录遇到的问 ...

  4. 九、IntelliJ IDEA 编译方式介绍及编译器的设置和选择

    相对于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也可以通过设置开启实时编译,但是太浪费资源了,因此不建议这样做.IntelliJ ...

  5. Django-rest-framework(一)简单入门使用

    简单的使用 Django-rest-framework 建成DRF,可以帮助我们快速构建出 django的rest full 风格的api接口. 其源码容易理解,所以我们可以很方便的使用. 安装 pi ...

  6. oracle 的分页查询与mysql 的分页查询

    oracle 的分页查询: select * from (select o.*,rownum rn  from Persons o) where rn >40 and rn <=60 : ...

  7. Navicat Premium 连接Oracle 数据库之配置

    Navicat Premium连接Oracle 数据库之配置 1.Oracle数据库服务器下载 Oracle官方网站下载数据库最新版本:http://www.oracle.com/technetwor ...

  8. SpringCloud微服务实战:一、Eureka注册中心服务端

    1.项目启动类application.java类名上增加@EnableEurekaServer注解,声明是注册中心 1 import org.springframework.boot.SpringAp ...

  9. django写一个简单的登陆注册

    要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...

  10. Sass学习日志

    一.什么是SASS SASS是一中CSS的开发工具,提供了许多便利的写法,大大节约了设计者们的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要方法.我们的目标是,有了这篇文章,日常的 ...