#include <iostream> #include <cassert> using namespace std; int selectKth(int a[],int start,int end,int k){ assert(start <= end && k <= end+); int left = start; int right = end; int pivotVal = a[left]; while(left < right){ whi…
这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2版"面试题39:数组中出现次数超过一半的数字"的解法一(基于partition,且哨兵选择数组第一个元素)中,有这么一句话: 我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数字,这句话让我产生了一点误解,让我误以为"只需要调用一次partition就能找到第k大的数…
遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因为不要求别的信息只要计算出第K大的元素.当然,如果在某种情况下需要频繁访问第K大的元素就可以先进行一次排序在直接得出结果. 第一种方式是这样,用选择排序,冒泡法,或者交换排序这类的排序,对前K个元素进行排序.这三种算法也许不是最快的排序算法.但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N…
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二大元素是20,第三大元素是17...... 第六大元素是9. 方法一:排序法 这是最容易想到的方法,先把无序数组从大到小进行排序,排序后的第k个元素自然就是数组中的第k大元素.但是这种方法的时间复杂度是O(nlogn),性能有些差. 方法二:插入法 维护一个长度为k的数组A的有序数组,用于存储已知的…
题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respectively, design an algorithm to find the kth largest key. The order  of growth of the worst case running time of your algorithm should be logn, where n…
(转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍            在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些以后再讨论.本文用两种最基本的方法来解决这个问题.使用java语言描述.例子是十个数中取第三大的. 算法一              用冒泡法将n个数从大到小排序,再取第k大. public class test { public static void main(String []args) {…
题目描述 以尽可能小的代价返回某无序系列中的两个最大值,当有重复的时设置某种机制进行选择. 题解 首先要考虑的是重复的数的问题. A.不处理重复数据方法:在处理第k大的元素时不处理重复的数据,也就是将原数组进行降序排序后,下标为k-1的元素. B.去除重复数据方法:忽略重复的数据,这时候需要首先对a进行去重处理(可以用哈希表),然后再按A的方法求解. 先排序,再求解: 用快排或堆排序,平均时间复杂度为O(N*logN),然后取出前k个,于是总时间复杂度为O(NlogN)+O(k)=O(NlogN…
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 || k > lenShort + lenLong,无. k <= lenShort,在两个数组前k个做二分. k > lenLong,判断两个特例位置(特例部分是因为好计算可直接返回结果,并且抛去特例可满足两数组剩余待二分部份长度相等的条件),否则二分. lenShort<k<…
给定两个有序数组arr1 和 arr2 ,再给定一个int K,返回所有的数中第K小的数 要求长度如果分别为 N M,时间复杂度O(log(min{M,N}),额外空间复杂度O(1) 解决此题的方法跟之前的求两个数组求中位数的情况,如出一辙~ 非常给力! 此题目需要分情况讨论: 假设长度较短的数组长度 lenS   较长的lenL 情况1. K<1  或者 K>lenS+lenL    k值无效 情况2. k<=lenS  分别在两数组选择第前 k个数, 然后取其中位数 情况3. k&g…
时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): print("Invalid parametres,please check!") temp = data[left] i = left j = right while (i != j): while (data[j]>=temp and i<j): j = j-1 whil…