`

17082 两个有序数序列中找第k小

 
阅读更多

17082 两个有序数序列中找第k小(必做)

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: C++;C;VC;JAVA

Description

已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n,
现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。

此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充分利用X和Y已经排好序的这一特性。




输入格式

第一行有三个数,分别是长度m、长度n和k,中间空格相连(1<=m,n<=100000; 1<=k<=m+n)。
第二行m个数分别是非减序的序列X。第三行n个数分别是非减序的序列Y。



输出格式

序列X和Y的第k小的数。



输入样例

5 6 7
1 8 12 12 21 
4 12 20 22 26 31



输出样例

20

 

#include <iostream>

#include <stdio.h>

#include <algorithm>

using namespace std;

int a[100000],b[100000];

int c[200000];

int m,n,k;

int main()

{

    freopen("in.txt","r",stdin);

    cin >> m>> n>> k;

    for(int i=0; i<m; i++)

        cin >> a[i];

    for(int i=0; i<n; i++)

        cin >>b[i];

    //for(int i=0;i<n+m;i++)

    // cin >>c[i];

    //sort(c,c+n+m);

    //cout << c[k-1] << endl;

    int l=0;

    int i=0,j=0;

    while(i<m||j<n)

    {

 

        if(i>=m&&j<n)

        {

            c[l++]= b[j++];

        }

        else if(j>=n&&i<m)

        {

            c[l++]=a[i++];

        }

        else

        {

            if(a[i]>=b[j])

            {

                c[l++]=b[j++];

            }

            else

            {

                c[l++]=a[i++];

            }

        }

 

    }

 

 

 

    cout <<c[k-1]<<endl;

    return 0;

}

分享到:
评论

相关推荐

    两个有序数序列中找第k小

    已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。 此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,...

    两个有序数序列中找第k小(必做)

    已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。

    合并两个有序顺序表

    归并排序中的一部分,就是将两个有序的子序列合并为一个有序序列。 在C++中,我们可以定义一个函数来完成这个任务。这个函数需要两个参数,分别代表两个已排序的顺序表。我们可以通过比较两个表的首元素,选择较小...

    算法中最小K元素的选择问题

    在计算机科学中,"算法中最小K元素的选择问题"是一个重要的数据结构和算法主题,它涉及到从一个无序或有序的数组中找到第K小(或大)的元素。这个问题在各种应用场景中都有广泛的应用,比如数据库查询优化、排序算法...

    已知有两个按元素值递增有序的顺序表A和B,设计一个算法将表A和表B的全部元素归并为一个按元素值递增有序的顺序表C。

    给定两个递增有序的顺序表A和B,我们的目标是将这两个表中的所有元素合并成一个新的递增有序的顺序表C。为了实现这一目标,我们可以采用如下的算法思路: 1. **初始化**:首先,我们需要创建一个新的顺序表C,并且...

    寻找第k小元素 基本算法复习

    将数组分为两个大小相等的部分,若k小于数组一半的大小,则在左半部分数组中寻找第k小元素;反之,在右半部分寻找第(k-n/2)小元素。这种方法需要递归地应用到每个子数组,直到子数组只剩一个元素。分治法在最坏情况...

    寻找第k小元素(vc)

    首先找到数组中第一个大于等于k的元素,然后在此元素之前的子数组中再寻找第k-1小的元素。这种方法适用于有序数组,时间复杂度为O(log n)。 6. **优先队列(堆)**:C++标准库提供了一个名为`&lt;queue&gt;`的头文件,...

    Java实现合并两个有序序列算法示例

    合并两个有序序列算法的思想是创建一个新的数组,逐步比较两个有序序列中的元素,将较小的元素加入到新数组中。该算法的时间复杂度为O(n),其中n是数组的输入规模。 在Java中,实现合并两个有序序列算法可以使用...

    快速排序输出第k小的数

    根据给定的代码片段,我们可以深入探讨如何利用快速排序算法来输出一个无序数组中的第k小的数。 ### 快速排序原理 快速排序是一种分而治之的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。...

    凯撒密码合并两个有序数组

    合并两个有序数组是指,给定两个已排序的整数数组arr1和arr2,我们需要创建一个新的数组,该数组包含两个输入数组的所有元素,并且仍然保持排序顺序。 ### 算法步骤: 1. 初始化三个指针:`i` 对应于 `arr1` 的...

    c语言编程题之数组操作合并两个有序数组.zip

    `main`函数中定义了两个有序数组,并调用`merge`函数进行合并,最后输出合并后的数组。 通过这个编程题,我们可以深入理解数组操作、指针操作以及如何在C语言中实现基本的排序算法。这种问题解决思路对于提升C语言...

    霍尔顿(Halton)序列.rar

    拟随机序列并不是真正的随机数,而是一类精心设计的有序序列,它们在统计性质上模仿了随机数的行为。Halton序列就是这类序列中的一个典范,由荷兰数学家Jan Halton在1960年提出,因其在多维积分和遍历问题中的优异...

    给定一个单调递增的整数序列,问某个整数是否在序列中

    1. **初始化**:设置两个指针,`low` 和 `high` 分别指向数组的第一个元素和最后一个元素。 2. **查找中间值**:计算数组中间位置的索引 `mid = (low + high) / 2`,并获取该位置的元素。 3. **比较中间值**: - ...

    2-路归并排序,写一个算法在链表结构上实现这一策略

    它的基本思想是将待排序的序列分成两个子序列,分别进行排序,然后将这两个已排序的子序列合并成一个有序序列。在这个过程中,通常会使用到链表结构,因为链表允许动态地改变元素之间的关系,而无需关心元素在内存中...

    C语言 归并排序

    归并排序的核心思想是将待排序的数组分成两部分,分别对这两部分进行排序,然后将两个有序数组合并成一个整体有序的数组。具体步骤如下: 1. **分割**:将数组分成两个或多个较小的子数组。 2. **递归排序**:递归地...

    归并算法之有序数组合并算法实现

    归并算法是一种常用的排序算法,通过将两个有序数组合并成一个有序数组来实现排序。 算法思想 归并算法的思想是将两个有序数组合并成一个有序数组。我们可以使用三个指针,分别指向两个数组和一个合并数组。然后,...

    FareySequence:计算 n 阶 Farey 序列的第 k 个元素

    序列中的每个分数都是相邻两个分数的调和平均数。例如,F_3是这样的序列:{0/1, 1/3, 1/2, 2/3, 1/1}。 计算法里序列通常涉及到递归或者迭代的过程。以下是一个简单的Java方法来生成n阶法里序列: ```java public ...

    合并排序算法,快速排序算法,递归,分治

    3. **合并**:将两个已排序的子序列合并成一个有序序列。合并过程中,比较两个子序列的首元素,较小的元素放入结果序列,重复此过程直到所有元素都被加入。 **快速排序算法(Quick Sort)** 快速排序是由C.A.R. ...

Global site tag (gtag.js) - Google Analytics