面试算法:在循环排序数组中快速查找第k小的值

一个长度为n的数组A,它是循环排序的,也就是说它的最小元素未必在数组的开头,而是在下标i,于是就有A[i]

378, 478, 550, 631, 103, 203, 220, 234, 279, 368, 370, 374

给定一个排序数组,假定数组所有元素都不相同,请你给出一个复杂度为O(lgn)的算法,查找出第k小的元素。对于上面例子,如果k = 10,那么对应元素为478.

解答这道题的关键是要找到数组中的最小值,由于最小值不一定在开头,如果它在数组中间的话,那么它一定具备这样的性质,假设第i个元素是最小值,那么有A[i-1]>A[i]

主入口处的函数为:

public class Searching {
public static void main(String[] args) {
int A[] = {378, 478, 550, 631, 103, 203, 220, 234, 279, 368, 370, 374};
int k = 10;
BinarySearchInCyclicallySortedArray bs = new BinarySearchInCyclicallySortedArray(A, k);
int v = bs.getGivenElement();
System.out.println(“the ” + k + ” th element in cyclically sorted array is : ” + v);
}
}

“`

上面代码运行后结果如下:

屏幕快照 2018-07-14 下午5.49.33.png

从运行结果来看,我们代码对算法的实现是正确的。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值