二维数组按数字大小选取前top k个数字

题目描述

二维数组,每行是降序的,且每行的长度不固定,综合选取去重后的前top-k大的数字。
输入:
[
[10,9,7,5,2]
[8,6,3]
[10,9,8,5]
]
选取前top-5大的数字
输出:
[10,9,8,7,6]

做法思想

选取top-k大(小)这种问题,首先想到用最大(小)堆解决,本题中考虑构建k个最大堆进行比较,若某个堆顶元素被选取了,则将指针往后移。

具体代码

import heapq
def run(nums, k):
	m = len(nums)
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个 Python 代码实现: ``` import random M = int(input("请输入 M 的值: ")) N = int(input("请输入 N 的值: ")) # 初始化二维数组 arr = [[random.randint(0, 100) for j in range(N)] for i in range(M)] # 输出原始二维数组 print("原始二维数组:") for row in arr: print(row) # 找出二维数组中的最大数和最小数 min_val = arr[0][0] max_val = arr[0][0] min_row, min_col = 0, 0 max_row, max_col = 0, 0 for i in range(M): for j in range(N): if arr[i][j] < min_val: min_val = arr[i][j] min_row, min_col = i, j if arr[i][j] > max_val: max_val = arr[i][j] max_row, max_col = i, j # 交换位置 arr[min_row][min_col], arr[max_row][max_col] = arr[max_row][max_col], arr[min_row][min_col] # 输出交换后的二维数组 print("交换后的二维数组:") for row in arr: print(row) ``` 该代码首先用随机数初始化一个 M×N 的二维数组,然后找出二维数组中的最大数和最小数,最后交换它们的位置并输出原始和交换后的二维数组。 ### 回答2: 首先,我们可以通过使用随机数对象来产生0到100之间的不同整数,并将其用于初始化一个M*N的二维数组。这可以通过嵌套循环来完成,外层循环控制行数,内层循环控制列数。在每个位置上,我们生成一个随机数并将其存储在数组中。 接下来,我们需要找出二维数组中的最大数和最小数,并将它们的位置交换。我们可以使用两个变量来存储最大数和最小数的值,然后在遍历数组时,将遇到的数与这两个变量进行比较。如果遇到比最大数更大的数,则更新最大数的值;如果遇到比最小数更小的数,则更新最小数的值。 完成遍历后,我们可以使用另一个变量来交换最大数和最小数的位置。这可以通过嵌套循环来实现,外层循环控制行数,内层循环控制列数。在每个位置上,当我们找到最大数时,我们将其值替换为最小数的值,并将最小数的值替换为最大数的值。 最后,我们输出原始二维数组及交换后的二维数组。这可以通过再次使用嵌套循环来完成,在每个位置上,我们打印数组中的值,并在每一行结束时换行。 下面是一个可能的实现: ```python import random M = 3 N = 4 # 初始化二维数组 arr = [[0] * N for _ in range(M)] # 生成0-100范围内的不同整数并初始化二维数组 unique_nums = random.sample(range(101), M * N) index = 0 for i in range(M): for j in range(N): arr[i][j] = unique_nums[index] index += 1 # 寻找最大数和最小数,并交换位置 min_num = arr[0][0] max_num = arr[0][0] min_row = 0 min_col = 0 max_row = 0 max_col = 0 for i in range(M): for j in range(N): if arr[i][j] < min_num: min_num = arr[i][j] min_row = i min_col = j if arr[i][j] > max_num: max_num = arr[i][j] max_row = i max_col = j # 交换最小数和最大数的位置 arr[min_row][min_col], arr[max_row][max_col] = arr[max_row][max_col], arr[min_row][min_col] # 输出原始二维数组 print("原始二维数组:") for i in range(M): for j in range(N): print(arr[i][j], end=' ') print() # 输出交换后的二维数组 print("交换后的二维数组:") for i in range(M): for j in range(N): print(arr[i][j], end=' ') print() ``` 注意:由于随机数的生成很难保证绝对的不同,因此可能会出现重复的数字。在代码中,我们使用了`random.sample()`函数来生成不同的数字,但请注意并不是完全保证不重复。 ### 回答3: 首先,我们可以使用随机数对象生成0到100之间的不同整数来初始化一个M*N的二维数组。假设M=3,N=4,我们可以得到以下原始二维数组: 原始数组: [[5, 34, 21, 70], [89, 41, 63, 17], [72, 95, 10, 49]] 然后,我们需要找到二维数组中的最大数和最小数,并将它们的位置进行交换。 最大数为95,位于数组下标[2, 1]处; 最小数为5,位于数组下标[0, 0]处。 交换它们的位置后得到新的二维数组: 交换后数组: [[95, 34, 21, 70], [89, 41, 63, 17], [72, 5, 10, 49]] 最后,我们将原始二维数组和交换后的二维数组输出。 原始二维数组: [[5, 34, 21, 70], [89, 41, 63, 17], [72, 95, 10, 49]] 交换后的二维数组: [[95, 34, 21, 70], [89, 41, 63, 17], [72, 5, 10, 49]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值