首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

找出数组中 K 整数(排序)

题目 给你一个字符串数组 nums 和一个整数 k 。 nums 中每个字符串都表示一个不含前导零整数。 返回 nums 中表示 k 整数字符串。...注意:重复数字在统计时会视为不同元素考虑。 例如,如果 nums 是 [“1”,“2”,“2”],那么 “2” 是最大整数,“2” 是第二整数,“1” 是第三整数。...示例 1: 输入:nums = ["3","6","7","10"], k = 4 输出:"3" 解释: nums 中数字按非递减顺序排列为 ["3","6","7","10"] 其中 4 整数是..."3" 示例 2: 输入:nums = ["2","21","12","1"], k = 3 输出:"2" 解释: nums 中数字按非递减顺序排列为 ["1","2","12","21"] 其中...3 整数是 "2" 示例 3: 输入:nums = ["0","0"], k = 2 输出:"0" 解释: nums 中数字按非递减顺序排列为 ["0","0"] 其中 2 整数是 "0"

79930

如何在 10 亿找出前 1000

之前小史在 BAT 三家面试中已经挂了两家,今天小史去了 BAT 中最后一家面试了。 简单自我介绍后,面试官给了小史一个问题。 ? 【面试现场】 ?...题目:如何在 10 亿找出前 1000 ? ? ? ? ? ? ? ? 小史:我可以用分治法,这有点类似快排中 partition 操作。...随机选一个 t,然后对整个数组进行 partition ,会得到两部分,前一部分都大于 t ,后一部分都小于 t 。 ? ?...如果前一部分小于 1000 个,那就在后一部分再进行 partition ,寻找剩下。 ? ? ? ? ? 小史:首先,partition 过程,时间是 o(n)。...buildHeap(n, data); // n往后进行调整 for(int i = n; i < data.length; i++) {

57420

数组中K

简介 查找一个序列中最大/最小值时间复杂度均为 ,而查询一个序列中 时间复杂度最坏情况下即为排序最好时间复杂度 只考虑比较排序),但利用快排 思想也可以达到期望 时间复杂度...然后判断: 如果枢轴左边小于等于枢轴序列大小等于 ,则说明即为枢轴。 如果枢轴左边小于等于枢轴序列大小大于 ,则说明一定在枢轴左边序列。...{ return FindKth(mid+1,t,k+(s-mid)-1,cmp); } } // 查找 k (随机化版本) template ...} else { return FindKth(gt+1,t,k-(gt-s+1),cmp); } } // 查找 k (随机化版本) template <typename...} else { return FindKth(gt+1,t,k-(gt-s+1),cmp); } } // 查找 k (随机化版本) template <typename

1.1K20

找出链表中倒数K个节点

今天来看一道有意思链表算法题目。 给到一个单向链表,要求找出该链表中倒数 k 个节点,要求只能遍历一次链表,且空间复杂度为 O(1)。...思路1:如果能从链表尾部开始遍历,那只需倒序遍历 k 个节点即是要找出节点,但是由于是单链表,只能从头结点开始遍历。...思路2:先遍历一遍该单链表,获取链表总节点数 n,那么 n-k+1 这个节点就是倒数 k 个节点。所以第二次再遍历到 n-k+1 这个节点即可,但是题目要求只能遍历一遍链表。...这样前后两指针距离始终都保持为 k-1,当前指针遍历到链表最后一个节点时,后指针刚好也就到了倒数 k 个节点了。 如果还没想明白的话,看下面的图应该就很好理解了。...推荐文章: mysql索引为啥要选择B+树 (下) 找出数组中只出现一次

65520

【面试必备】如何在10亿找出前1000?

简单自我介绍后,面试官给了小史一个问题。 【面试现场】 题目:如何在10亿找出前1000? 小史:我可以用分治法,这有点类似快排中partition操作。...随机选一个t,然后对整个数组进行partition,会得到两部分,前一部分都大于t,后一部分都小于t。 小史:如果说前一部分总数大于1000个,那就继续在前一部分进行partition寻找。...如果前一部分小于1000个,那就在后一部分再进行partition,寻找剩下。 小史:首先,partition过程,时间是o(n)。...而n+n/2+n/4+...显然是小于2n,所以这个方法渐进时间只有o(n) (注:这里时间复杂度计算只是简化计算版,真正严谨数学证明可以参考算法导论相关分析。) 半分钟过去了。...小史:感悟还挺深。虽然平时做过topN问题,知道分治法时间更少。但是碰到具体问题时候还是要具体分析,这种大数据量情况下反而用堆会更快。 ?

78230

【面试现场】如何在10亿找出前1000

简单自我介绍后,面试官给了小史一个问题。 ? 【面试现场】 ? 题目:如何在10亿找出前1000? ? ? ? ? ? ? ?...小史:我可以用分治法,这有点类似快排中partition操作。随机选一个t,然后对整个数组进行partition,会得到两部分,前一部分都大于t,后一部分都小于t。...如果前一部分小于1000个,那就在后一部分再进行partition,寻找剩下。 ? ? ? ? ? 小史:首先,partition过程,时间是o(n)。...而n+n/2+n/4+...显然是小于2n,所以这个方法渐进时间只有o(n) ? (注:这里时间复杂度计算只是简化计算版,真正严谨数学证明可以参考算法导论相关分析。) ? ? ?...buildHeap(n, data); // n往后进行调整 for(int i = n; i < data.length; i++) {

37610

【BAT面试必会】如何在10亿找出前1000

【面试现场】 题目:如何在10亿找出前1000? ? ? ? ? ? ? ? 小史:我可以用分治法,这有点类似快排中partition操作。...随机选一个t,然后对整个数组进行partition,会得到两部分,前一部分都大于t,后一部分都小于t。 ? ?...如果前一部分小于1000个,那就在后一部分再进行partition,寻找剩下。 ? ? ? ? ? 小史:首先,partition过程,时间是o(n)。...而n+n/2+n/4+...显然是小于2n,所以这个方法渐进时间只有o(n) ? (注:这里时间复杂度计算只是简化计算版,真正严谨数学证明可以参考算法导论相关分析。) ? ? ?...buildHeap(n, data); // n往后进行调整 for(int i = n; i < data.length; i++) {

50810

leetcode链表之找出倒数k个节点

序 本文主要记录一下leetcode链表之找出倒数k个节点 136_0.png 题目 输入一个链表,输出该链表中倒数k个节点。...为了符合大多数人习惯,本题从1开始计数,即链表尾节点是倒数1个节点。例如,一个链表有6个节点,从头节点开始,它们值依次是1、2、3、4、5、6。...这个链表倒数3个节点是值为4节点。 ​ ​ 示例: ​ 给定一个链表: 1->2->3->4->5, 和 k = 2. ​ 返回链表 4->5. ​...,然后两个指针同步走,当快指针走到头时,慢指针就是链表倒数k个节点。...小结 这里采用了快慢指针套路,先让快指针走k步,然后两个指针同步走,当快指针走到头时,慢指针就是链表倒数k个节点。

79110

K个最大+优化优先队列

K个最大 给定整数数组 nums 和整数 k,请返回数组中 k 个最大元素。 请注意,你需要找是数组排序后 k 个最大元素,而不是 k 个不同元素。...看看源码 private final static int max= 10^5 +1; //优先队列PQ //给定整数数组 nums 和整数 k,请返回数组中 k 个最大元素。...,把减少部分尽量换成时间复杂度为O(1)比较操作,这样假设有m次add,那么有(n-m)次比较,综合起来就是O(klogk)+O(n-k) 题目中要求K个最大,数组长度是N,所以定义堆时候大小为...K,然后用剩下N-k个数和堆顶元素比较,最后堆顶即为结果: (1)如果K>2/N,最好做(N-K)次add操作。...K个最大,就是(N-K)个最小,因此用(N-K)大小最大堆,堆顶就是结果。

12510
领券