首页
学习
活动
专区
工具
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"

    85430

    如何在 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++) {

    60920

    数组中第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+树 (下) 找出数组中只出现一次的数

    69120

    【面试必备】如何在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的问题,知道分治法时间更少。但是碰到具体问题的时候还是要具体分析,这种大数据量的情况下反而用堆会更快。 ?

    81630

    【面试现场】如何在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++) {

    40110

    【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++) {

    53710

    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个节点。

    87310

    第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)大小的最大堆,堆顶就是结果。

    16710
    领券