c++ - 需要帮助为我的算法中的缺陷提出优雅的修复

标签 c++ c algorithm

我正在为一家大型在线零售商的面试而练习,现在我正在尝试为“两个已排序数组的中位数”问题提出一个优雅的解决方案。我知道 youtube 上提出的解决方案,但我正在尝试编写另一种方法。我写出来了

include <stdio.h>

int M2SA ( int * A, int m, int * B, int n )
{
   /* Returns the median of two sorted arrays A and B of lengths m and n respectively. 
      Assumes A and B aren't both empty. 
   */ 
   int ida = 0, idb = 0, idmed = (m+n)/2;
   while ((ida + idb) != idmed)
   {
     if (A[ida] < B[idb])
        ++ida;
     else
        ++idb;
   }
   return (A[ida] < A[idb] ? A[ida] : B[idb]);
} 



int main()
{
    int arr1 [] = {1, 1, 59, 69};
    int arr2 [] = {-4, 0, 49, 59, 59, 59};
    printf("%d", M2SA(arr1, sizeof(arr1)/sizeof(int), arr2, sizeof(arr2)/sizeof(int)));
    return 0;
}

它打印出正确答案 (59),但我意识到我的算法存在一个缺陷,即只有当 idmed 不大于 m< 时我的算法才有效n。例如,如果数组是 {1}{69, 293, 393, 1923129},则 ida 等于 1while 循环的第一次迭代之后,因此 while 循环的第二次迭代尝试访问 A[1]。但是,我想不出一个简单的修复方法来添加到我的代码中。有没有简单的?

最佳答案

这是对您的解决方案的优雅修复:

int ida = 0, idb = 0, idmed = (m + n) / 2;
while (ida < m && idb < n && ida + idb < idmed) {
    A[ida] < B[idb] ? ++ida : ++idb;
}
if (ida == m) return B[idmed - m];
if (idb == n) return A[idmed - n];
return A[ida] < B[idb] ? A[ida] : B[idb];

关于c++ - 需要帮助为我的算法中的缺陷提出优雅的修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738082/

相关文章:

c++ - 创建一个包含两种不同数据类型或类的 vector

c - If 语句与函数指针

我可以使用箭头运算符 (->) 访问我的并集吗?

python - 有效地找到最相似的集合(Python,数据结构)

python - 在 Python 中第一次出现模式时搜索 1GB+ 数据字符串的最快方法

algorithm - "Flip"仅使用 +1/-1 而不使用 if/else 的简单循环的输出

c++ - 如何消除挑战 'Sam and sub-strings' 中与模数相关的错误?

c++ - Qt/C++ 中的 ComboBox 默认值

c++ - 通过多个 fork 管道标准输入/输出

C 源代码、Watcom 编译器和 EMU8086