`
wss71104307
  • 浏览: 222986 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

求2个有序数组都是N长的,求第K大的(假设数组没有重复)

阅读更多
/*
 求2有序N长数组,第K大的数
*/
#include <stdio.h>

#include <iostream>
#include <assert.h>
#include <algorithm>

#define min(x,y)  (x)<(y) ?  (x) : (y)
#define max(x,y)  (x)>(y) ?  (x) : (y)

const int N = 4;

using namespace std;


//方法一  注意 第K大,还有2个边际
int FindKth(int A[], int B[], int n, int low ,int high, int k)
{
	int m=(low+high)/2+1;
	if(low>high) return '\0';    
    if(k==m)
	{
		return A[m-1]<=B[0] ?  A[m-1] : FindKth(A, B, n, low, m-2, k);
	}
	else if(k==(N+m)) 
	{
		return A[m-1]>=B[N-1] ? A[m-1] : FindKth(A, B, n, m, high, k);
	}
    else if(k<m+1) return FindKth(A, B, n, low, high-1, k);
	else if(k>N+m) return FindKth(A, B, n, low+1, high, k);
	else if (A[m-1]>B[k-m-1]  &&  A[m-1]<B[k-m] )
	{
		return A[m-1];
	}
	else if(A[m-1]>B[k-m])
	{
		return FindKth(A,B,n,low ,m-2, k);
	}
	else  return FindKth(A, B, n, m, high, k);
}

int Find_Kth_IN_Arrays(int A[], int B[], int n, int k)
{
     int value=FindKth(A, B, n, 0, n-1, k);
	 if(value=='\0') value=FindKth(B, A, n, 0, n-1, k);
     return value;
}


//方法二,

int FindKthElement(int a[], int b[], int k)
{
    if(k == 1)
        return min(a[0], b[0]);
    else if(k == N * 2)
        return max(a[N - 1], b[N - 1]);
    int left = max(k - N - 1, 0), right = N - 1;
    while(left <= right)
    {
        int mid = (left + right) / 2;

        if(mid + 1 == k)
        {
            if(a[mid] < b[0])
                return a[mid];
            else
                right = mid - 1;
        }
        else if(mid + 1 + N == k)
        {
            if(a[mid] > b[k - mid - 2])
                return a[mid];
            else
                left = mid + 1;
        }
        else
        {
            if(a[mid] > b[k - mid - 2] && a[mid] < b[k - mid  - 1])
                return a[mid];
            else if(a[mid] > b[k - mid - 2] && a[mid] > b[k - mid - 1])
                right = mid - 1;
            else
                left = mid + 1;
        }
    }
    return FindKthElement(b, a, k);
}

int main()
{
    int K;
    int a[] = {1, 3, 7, 8};
    int b[] = {2, 4 , 5, 6};
    while(cin >> K)
    {
        assert(K >= 1 && K <= N * 2);
        cout << FindKthElement(a, b, K) << endl;
		cout<<Find_Kth_IN_Arrays(a, b, 4, K)<<endl;
    }

    return 0;
}
 
分享到:
评论

相关推荐

    将两个有序数组,合并成另一个有序的数组,升序

    当其中一个数组(这里假设是数组a)的所有元素都被放入c后,剩下的元素(来自数组b)会被直接追加到c的末尾,因为此时b数组中的元素都比a数组的剩余元素大。同样地,如果数组b先排完,那么数组a的剩余元素会追加到c...

    C++算法:寻找两个有序数组的中位数

    算法:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = ...

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

    2. 初始化两个指针,分别指向两个原始有序数组的首元素。 3. 比较两个指针所指向的元素,将较小的元素放入新数组,并将该元素所在数组的指针后移一位。 4. 当一个数组的所有元素都被添加到新数组后,将另一个数组...

    php-leetcode题解之合并两个有序数组.zip

    假设我们有两个已排序的数组`array1`和`array2`,目标是将这两个数组合并成一个新的有序数组。这里的“有序”意味着数组中的元素按升序排列。我们需要设计一个算法,能在尽可能短的时间内完成合并,并保持新数组的...

    java-leetcode题解之第26题删除有序数组中的重复项.zip

    在本压缩包中,我们关注的是Java编程语言在解决LeetCode算法问题上的应用,特别是针对第26题“删除有序数组中的重复项”。这是一道经典的数组处理问题,旨在提高我们对数组操作的理解以及对效率的追求。让我们深入...

    python-leetcode面试题解之第26题删除有序数组中的重复项-python题解.zip

    在本压缩包中,我们关注的是一个Python编程与算法面试相关的资源,具体是LeetCode面试题的第26题——“删除有序数组中的重复项”。LeetCode是一个热门的在线平台,它提供了各种编程题目,帮助程序员提升算法技能,...

    Merge(合并两个已排好序的数组)

    在这个问题中,我们假设两个数组已经预先按照升序(从小到大)进行了排序。常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。在这个场景下,由于数组已经排序,我们可以直接进行合并操作,而不...

    两个数组交集(双指针)1

    这个问题可以通过双指针法来解决,这是一种常见的处理数组问题的方法,尤其适用于处理有序数组或部分有序数组的情况。以下是详细的解题过程: 首先,我们需要对输入的两个数组`nums1`和`nums2`进行排序。这里使用了...

    两个升序的数组A、B,将AB合并到C,保持升序,去除重生的元素

    本问题涉及的是两个已按升序排列的整数数组A和B的合并,目标是将它们合并到一个新的数组C中,同时确保C也按升序排列,并且在合并过程中去除重复的元素。下面将详细探讨这个过程的实现方法。 首先,我们要明确合并两...

    java-leetcode面试题解双指针之第88题合并两个有序数组.zip

    假设我们有两个已排序的整数数组`nums1`和`nums2`,我们需要将它们合并成一个新的有序数组,且不得使用额外的空间。这意味着我们需要在原地修改`nums1`数组,同时保持其排序顺序,将`nums2`中的元素合并进去。 双...

    合并有序数组的实现(java与C语言)

    合并有序数组是计算机科学中的一种基本操作,它可以将两个已经排序的数组合并成一个有序数组。合并有序数组的实现有很多种方法,本文主要介绍了Java和C语言的实现方法。 Java版本的实现 ---------------- 在Java中...

    Python实现的合并两个有序数组算法示例

    本文实例讲述了Python实现的合并两个有序数组算法。分享给大家供大家参考,具体如下: 思路 按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标超过数组长度...

    有序数组的折半查找

    **有序数组的折半查找(Binary Search)** 折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。相比传统的顺序查找,它具有更高的效率,尤其是在大型数据集上。折半查找的基本思想是利用数组的...

    二分法求数组和

    假设数组 `a = [2, 3, 5, 7, 19, 20]`,求 `a[0]` 到 `a[5]` 的和。 1. **初始调用**:`f(a, 0, 5)`。 2. **中间索引**:`mid = (0 + 5) / 2 = 2`。 3. **递归计算**: - `f(a, 0, 1)` 和 `f(a, 2, 4)`。 - 对于 ...

    c语言面试题之双指针两数之和-输入有序数组.zip

    本面试题探讨的是如何利用双指针找到输入有序数组中的两个数,使得它们的和等于一个特定的目标值。这个问题在算法设计和数据结构的学习中具有重要意义,因为它涉及到数组的遍历、条件判断以及效率优化。 首先,我们...

    python 两个排序数组的中位数

    # 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 # 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) # 你可以假设 nums1 和 nums2 不同时为空 # 示例 1: # nums1 = [1, 3] # nums2 = [2] #...

    两数之和 - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 ...

    java实现把两个有序数组合并到一个数组的实例

    在Java编程中,有时我们需要将两个已排序的数组合并成一个新的有序数组。这在处理大量数据时非常有用,比如在数据库查询、数据排序或者算法设计中。本篇将详细讲解如何利用Java实现这个功能,通过一个具体的实例来...

    寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例1: nums1 = [1, 3] ...

    JS 去掉数组中重复项

    假设我们有一个数组`[1, 2, 2, 3, 4, 4, 5]`,我们希望去除其中的重复元素,得到`[1, 2, 3, 4, 5]`。在JavaScript中,有多种方法可以实现这一目标。 1. **使用Set对象** ES6引入了Set数据结构,它类似于数组,但...

Global site tag (gtag.js) - Google Analytics