/*
求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...
算法:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = ...
2. 初始化两个指针,分别指向两个原始有序数组的首元素。 3. 比较两个指针所指向的元素,将较小的元素放入新数组,并将该元素所在数组的指针后移一位。 4. 当一个数组的所有元素都被添加到新数组后,将另一个数组...
假设我们有两个已排序的数组`array1`和`array2`,目标是将这两个数组合并成一个新的有序数组。这里的“有序”意味着数组中的元素按升序排列。我们需要设计一个算法,能在尽可能短的时间内完成合并,并保持新数组的...
在本压缩包中,我们关注的是Java编程语言在解决LeetCode算法问题上的应用,特别是针对第26题“删除有序数组中的重复项”。这是一道经典的数组处理问题,旨在提高我们对数组操作的理解以及对效率的追求。让我们深入...
在本压缩包中,我们关注的是一个Python编程与算法面试相关的资源,具体是LeetCode面试题的第26题——“删除有序数组中的重复项”。LeetCode是一个热门的在线平台,它提供了各种编程题目,帮助程序员提升算法技能,...
在这个问题中,我们假设两个数组已经预先按照升序(从小到大)进行了排序。常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。在这个场景下,由于数组已经排序,我们可以直接进行合并操作,而不...
这个问题可以通过双指针法来解决,这是一种常见的处理数组问题的方法,尤其适用于处理有序数组或部分有序数组的情况。以下是详细的解题过程: 首先,我们需要对输入的两个数组`nums1`和`nums2`进行排序。这里使用了...
本问题涉及的是两个已按升序排列的整数数组A和B的合并,目标是将它们合并到一个新的数组C中,同时确保C也按升序排列,并且在合并过程中去除重复的元素。下面将详细探讨这个过程的实现方法。 首先,我们要明确合并两...
假设我们有两个已排序的整数数组`nums1`和`nums2`,我们需要将它们合并成一个新的有序数组,且不得使用额外的空间。这意味着我们需要在原地修改`nums1`数组,同时保持其排序顺序,将`nums2`中的元素合并进去。 双...
合并有序数组是计算机科学中的一种基本操作,它可以将两个已经排序的数组合并成一个有序数组。合并有序数组的实现有很多种方法,本文主要介绍了Java和C语言的实现方法。 Java版本的实现 ---------------- 在Java中...
本文实例讲述了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)`。 - 对于 ...
本面试题探讨的是如何利用双指针找到输入有序数组中的两个数,使得它们的和等于一个特定的目标值。这个问题在算法设计和数据结构的学习中具有重要意义,因为它涉及到数组的遍历、条件判断以及效率优化。 首先,我们...
# 给定两个大小为 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实现这个功能,通过一个具体的实例来...
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例1: nums1 = [1, 3] ...
假设我们有一个数组`[1, 2, 2, 3, 4, 4, 5]`,我们希望去除其中的重复元素,得到`[1, 2, 3, 4, 5]`。在JavaScript中,有多种方法可以实现这一目标。 1. **使用Set对象** ES6引入了Set数据结构,它类似于数组,但...