首页 > 试题广场 >

在两个排序数组中找到第k小的数

[编程题]在两个排序数组中找到第k小的数
  • 热度指数:1137 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个有序数组arr1和arr2,再给定一个整数K,返回所有数中第K小的数。
[要求]
如果arr1的长度为N,arr2的长度为M,时间复杂度请达到,额外空间复杂度

输入描述:
第一行三个整数N, M, K分别表示数组arr1, arr2的大小,以及需要询问的数
接下来一行N个整数,表示arr1内的元素
再接下来一行M个整数,表示arr2内的元素


输出描述:
输出一个整数表示答案
示例1

输入

5 3 1
1 2 3 4 5
3 4 5

输出

1

说明

1是所有数中第一小的数
示例2

输入

3 4 4
1 2 3
3 4 5 6

输出

3

说明

3是所有数中第4小的数,所以返回3

备注:
要想空间复杂度达到O(1),在归并时不用额外空间去存储已经排好序的部分即可,到第k个数时直接打印结果,终止归并过程。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().split(" ");
        int n = Integer.parseInt(params[0]), m = Integer.parseInt(params[1]), k = Integer.parseInt(params[2]);
        params = br.readLine().split(" ");
        int[] nums1 = new int[n];
        for(int i = 0; i < n; i++) nums1[i] = Integer.parseInt(params[i]);
        params = br.readLine().split(" ");
        int[] nums2 = new int[m];
        for(int i = 0; i < m; i++) nums2[i] = Integer.parseInt(params[i]);
        // 归并
        int p1 = 0, p2 = 0, p = 0;
        while(p1 < n && p2 < m){
            if(nums1[p1] < nums2[p2]){
                p1 ++;
                p ++;
                if(p == k){
                    System.out.println(nums1[p1 - 1]);
                    break;
                }
            }else{
                p2 ++;
                p ++;
                if(p == k){
                    System.out.println(nums2[p2 - 1]);
                    break;
                }
            }
        }
    }
}

发表于 2021-11-14 09:12:56 回复(0)