找出两个数字列表的中间值

给出两个有序的数字列表,长度分别为m,n。找到这两个列表中的中间值。(第一次出现了时间复杂度的要求噢)

#例子一:总长度为奇数
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
#例子二:总长度为偶数
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

仔细分析题目,nums1和nums2都已经是排好序了的,这就大大的降低了难度,让找到两个列表的中间值,其实我们可以拓展为找到两个列表的第k个值。当然这个是拓展部分了,对于这个题目,有不同的思路,最简单粗暴的就是将两个列表合并,之后进行排序,排好序后进行寻找中间值就简单了。但是用传统的先合并再排序,效率想必会很低~

我们发现对于两个已经有序的列表(从小到大),其实有一个更优的排序方式:从小到大,依次进行列表元素的比较(为方便表述,称两个列表为A,B),较小值放到一个新列表中,比如A中该位置的值较小,将其放到新的列表C中,同时将A列表下一个值继续与B中当前位置元素进行比较,以此类推。我们称其为双指针法这样的比较次数就比先合并在排序小很多啦!代码如下:

def FindMidium(nums1,nums2):
    n1=len(nums1)
    n2=len(nums2)

    """首先将nums1,nums2合并为一个基本有序的列表(小数在左,大数在右端)"""

    #创建一个新列表,为了合并两个列表
    list=[0]*(n1+n2)

    """当输入两个列表都还存在元素没进行比较的时候,循环进行对比
    并将较小值放入新列表,同时较小元素的列表和新列表索引加一"""
    i_1,i_2,i=0,0,0

    while i_1<n1 and i_2<n2:
        if nums1[i_1]<nums2[i_2]:
            list[i]=nums1[i_1]
            i_1+=1
            i+=1
        elif nums1[i_1]>nums2[i_2]:
            list[i] = nums2[i_2]
            i_2 += 1
            i += 1
    """当存在某一个列表所有元素已经比较完,即排好了序
    剩下那个列表剩下的值直接放入新列表对应位置即可"""

    if i<n1:
        list[i:]=nums1[i_1:]
    else:
        list[i:] = nums2[i_2:]
    """取list列表的中位数"""
    if len(list)%2!=0: 
        return list[len(list)//2]
    else:
        return (list[len(list)//2-1]+list[len(list)//2])/2

"""测试代码"""
nums1 = [1, 2]
nums2 = [3, 4]
a=FindMidium(nums1,nums2)
print(a)
要在C语言中找出n个中的最大值、最小值以及中间值,可以按照以下步骤实现: 首先需要定义一个组存储这n个数字。然后通过遍历这个组分别找到其中的最大值和最小值。 对于中间值的概念,在这里我们可以理解为排序后的组中间位置的元素(如果长度是偶,则取两个中间之一)。以下是完整的示例代码及解释: ```c #include <stdio.h> int main() { int n; // 输入据的量 printf("请输入数字:"); scanf("%d", &n); if (n <= 0) { // 确保输入有效 return -1; } int arr[n]; // 动态创建大小为n的整型组 // 输入每个值到arr[]里 for(int i = 0; i < n; ++i){ printf("请输入第 %d 个:", i+1); scanf("%d", &arr[i]); } int max = arr[0]; int min = arr[0]; // 遍历寻找最大与最小值 for(int j=1;j<n;++j){ if(arr[j]>max) max=arr[j]; if(arr[j]<min) min=arr[j]; } printf("\n最大值:%d\n", max); printf("最小值:%d\n", min); // 排序找中间值 for(int k=0;k<n-1;k++){ for(int m=k+1;m<n;m++) if(arr[k] > arr[m]){ int temp=arr[k]; arr[k]=arr[m]; arr[m]=temp; } } double median; if(n%2 == 0){ // 偶情况下的中间值处理 median=(arr[(n/2)-1]+arr[n/2])/2.0; }else{ median=arr[n/2]; // 奇直接返回正中间那个 } printf("中间值:%f\n",median); return 0; } ``` 上述程序实现了: 1. 用户输入一组; 2. 输出该组的最大值、最小值; 3. 根据是否能平均分为两半计算得出“中间”值。 注意这里的算法时间复杂度较高O(n^2),主要是为了简单演示方便,并非最优解法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值