O(n)时间复杂度内数组找到第二大的值

def secondeNum(lst):
    """
    找到第二大的数字
    时间复杂度:O(n)
    空间复杂度:O(1)
    """
    import sys
    max_item = sec_item = -sys.maxsize
    for item in lst:
        if item > max_item:
            sec_item = max_item#把前一轮最大值变量赋值给第二大值,因为进入这里时,说明当前轮item为最新最大值
            max_item = item
        #当item比最大值小时,如果item比第二大值大,则更新第二大值
        elif sec_item < item and item < max_item:# item < max_item是为了排查item=max_item情况
            sec_item = item
    return sec_item
from random import shuffle
lst = list(range(1,300))#较大数据量
# lst = []
lst.append(299)
lst.append(298)
lst.append(298)
lst.append(300)
shuffle(lst)
print(lst)
print(secondeNum(lst))
[69, 106, 49, 181, 186, 105, 76, 234, 93, 292, 166, 51, 39, 298, 120, 259, 158, 16, 194, 29, 23, 254, 281, 237, 223, 129, 224, 298, 94, 298, 32, 225, 46, 33, 17, 245, 134, 294, 289, 219, 43, 170, 222, 40, 226, 121, 146, 253, 5, 282, 238, 283, 287, 116, 91, 190, 10, 50, 103, 272, 285, 141, 198, 159, 2, 290, 8, 268, 90, 98, 59, 210, 236, 73, 74, 128, 7, 209, 99, 260, 208, 124, 87, 81, 36, 22, 214, 12, 57, 284, 207, 31, 295, 62, 71, 125, 127, 204, 182, 183, 96, 92, 213, 100, 178, 54, 110, 205, 144, 38, 276, 212, 143, 169, 299, 199, 140, 269, 252, 1, 258, 227, 235, 80, 248, 35, 241, 239, 149, 107, 60, 189, 67, 27, 206, 232, 286, 196, 65, 229, 115, 77, 263, 26, 44, 24, 163, 244, 271, 152, 97, 230, 249, 58, 138, 246, 122, 275, 20, 88, 151, 243, 200, 216, 197, 202, 111, 157, 139, 95, 61, 79, 48, 153, 242, 55, 19, 177, 13, 117, 84, 279, 137, 52, 179, 64, 288, 109, 160, 228, 296, 72, 112, 168, 156, 75, 274, 176, 233, 102, 172, 266, 221, 291, 162, 104, 63, 203, 195, 231, 45, 300, 218, 123, 14, 261, 188, 150, 192, 114, 273, 240, 277, 4, 257, 217, 6, 66, 165, 251, 41, 37, 201, 167, 34, 293, 28, 211, 89, 30, 247, 145, 131, 264, 21, 297, 130, 265, 220, 42, 56, 215, 299, 108, 184, 101, 171, 82, 180, 9, 185, 47, 155, 187, 133, 83, 280, 25, 135, 175, 161, 267, 3, 262, 174, 68, 148, 250, 164, 270, 53, 113, 255, 11, 193, 15, 132, 78, 70, 136, 18, 86, 278, 191, 173, 119, 154, 147, 126, 256, 118, 85, 142]
299
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用快速选择算法(QuickSelect Algorithm)来实现在 O(n) 时间复杂度内查找数组中第 k 大的元素。 快速选择算法的基本思路与快速排序类似,都是通过分治的思想将问题规模不断缩小。但是,快速选择算法只需要对单边递归进行处理,而不需要对两边都递归处理。具体步骤如下: 1. 选择数组中的一个元素作为 pivot 元素。 2. 将数组中小于 pivot 的元素放在 pivot 左边,大于 pivot 的元素放在 pivot 右边。这个过程可以使用 partition 函实现,可以参考快速排序的实现。 3. 如果 pivot 的位置恰好为 k-1,则 pivot 就是第 k 大的元素,直接返回。 4. 如果 pivot 的位置小于 k-1,则第 k 大的元素在 pivot 右边,对右边的元素再进行快速选择。 5. 如果 pivot 的位置大于 k-1,则第 k 大的元素在 pivot 左边,对左边的元素再进行快速选择。 下面是一个基于快速选择算法的实现: ```c int partition(int arr[], int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; } int quickSelect(int arr[], int left, int right, int k) { if (left == right) { return arr[left]; } int pivotIndex = partition(arr, left, right); if (pivotIndex == k - 1) { return arr[pivotIndex]; } else if (pivotIndex < k - 1) { return quickSelect(arr, pivotIndex + 1, right, k); } else { return quickSelect(arr, left, pivotIndex - 1, k); } } int findKthLargest(int arr[], int size, int k) { return quickSelect(arr, 0, size - 1, size - k + 1); } ``` 其中,`partition` 函用于将数组分成左右两个部分,`quickSelect` 函用于递归地进行快速选择,`findKthLargest` 函是对外的接口,用于调用 `quickSelect` 函并返回结果。 需要注意的是,在 `quickSelect` 函中,`k` 的是倒第 k 大的元素在数组中的位置,因此需要将 `size - k + 1` 作为 `quickSelect` 的参传入,最终返回的是第 k 大的元素的

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值