列表

详情


NC251. 多数组第 K 小数

描述

给定两个升序的数列 arr1 和 arr2 ,和一个整数 target ,请你找出两个数列中第 K 小的值。

数据范围:两个数列的长度都满足 ,数列中的值都满足 ,给定整数大小满足

示例1

输入:

[1,2,3,4],[1,3,4],2

输出:

1

说明:

两个数列中数升序排列是 1 1 2 3 3 4,故第二小的是 1

示例2

输入:

[1,2,3,4],[1,3,4],7

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 181ms, 内存消耗: 59096KB, 提交时间: 2022-05-08

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}
();
class Solution {
  public:
    int findKthNum(vector<int>& a, vector<int>& b, int t) {
        int i = 0, j = 0, k = a.size();
        while (--t) {
            if (a[i] < b[j] and i < k) ++i;
            else ++j;
        }
        if (i >= k)
            return b[j];
        if (j >= b.size())
            return a[i];
        return min(a[i], b[j]);
    }
};

C++ 解法, 执行用时: 215ms, 内存消耗: 59080KB, 提交时间: 2022-05-20

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr1 int整型vector 
     * @param arr2 int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int findKthNum(vector<int>& arr1, vector<int>& arr2, int target) {
        // write code here
        int i=0,j=0;
        while(--target)
        {
            if(arr1[i]<arr2[j]&&i<arr1.size())
                i++;
            else j++;
        }
        if(i>=arr1.size())
            return arr2[j];
        if(j>=arr2.size())
            return arr1[i];
        return min(arr1[i],arr2[j]);
    }
};

C++ 解法, 执行用时: 218ms, 内存消耗: 59080KB, 提交时间: 2022-02-15

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr1 int整型vector 
     * @param arr2 int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int findKthNum(vector<int>& arr1, vector<int>& arr2, int target) {
        // write code here
        int i = 0, j = 0, sz = arr1.size();
        while (--target) {
            if (arr1[i] < arr2[j] and i < sz) ++i;
            else ++j;
        }
        
        if (i >= sz) return arr2[j];
        if (j >= arr2.size()) return arr1[i];
        return min(arr1[i], arr2[j]);
        
    }
};

C 解法, 执行用时: 400ms, 内存消耗: 58924KB, 提交时间: 2022-02-25

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param arr1 int整型一维数组 
 * @param arr1Len int arr1数组长度
 * @param arr2 int整型一维数组 
 * @param arr2Len int arr2数组长度
 * @param target int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int findKthNum(int* arr1, int arr1Len, int* arr2, int arr2Len, int target ) {
    // write code here
    int i = 0, j = 0;
    int result;
    // if(target == arr1Len + arr2Len)return arr1[arr1Len-1]>arr2[arr2Len-1]?arr1[arr1Len-1]:arr2[arr2Len-1];
    while(target--){
        if(arr1[i] <= arr2[j]){
            result = arr1[i];
            i += 1;
            if(i >= arr1Len && target)return arr2[j+target-1];
        }else{
            result = arr2[j];
            j += 1;
            if(j >= arr2Len && target)return arr1[i+target-1];
        }
    }
    return result;
}

C++ 解法, 执行用时: 404ms, 内存消耗: 59052KB, 提交时间: 2022-01-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr1 int整型vector 
     * @param arr2 int整型vector 
     * @param target int整型 
     * @return int整型
     */
	int findKthNum(vector<int>& arr1, vector<int>& arr2, int target) 
	{
		int id1 = 0;
		int id2 = 0;
		int result = 0;
		arr1.push_back(INT_MAX);
		arr2.push_back(INT_MAX);
		while (true)
		{
			if (arr1[id1] < arr2[id2])
			{
				result = arr1[id1];
				++id1;
			}
			else
			{
				result = arr2[id2];
				++id2;
			}
			if (id1 + id2 == target) return result;
		}
		return result;
	}
};

上一题