Algorithm 递归以获得数组中的最大差异
返回数组中的一对数字p和q。p必须出现在数组中的q之前,并且q-p必须是可能的最高值 A=[1,4,12,5,9,1,3,8] 返回值为p=1&q=12 有人提出了以下解决方案。 但是,我不确定在“第三种情况”中它应该返回什么,如下所示: 建议: 将A均匀地分成两个较小的数组A1、A2,然后(递归地)解决A1和A2上的问题。这能帮你找到一个最佳的选择吗?别忘了你可以使用额外的处理,成本高达O(n)。假设p,q是A的最佳对。p,q∈A1,或p,q∈A2,或者这两种情况都不正确。在第三种情况下,关于p和q你能说些什么 下面是我的代码,它基本上划分数组,从上半部分得到最小值,从下半部分得到最大值。这个问题有0(n)个解决方案,但我对递归感兴趣,因为我正在学习递归。因此,请不要建议任何其他解决方案Algorithm 递归以获得数组中的最大差异,algorithm,recursion,Algorithm,Recursion,返回数组中的一对数字p和q。p必须出现在数组中的q之前,并且q-p必须是可能的最高值 A=[1,4,12,5,9,1,3,8] 返回值为p=1&q=12 有人提出了以下解决方案。 但是,我不确定在“第三种情况”中它应该返回什么,如下所示: 建议: 将A均匀地分成两个较小的数组A1、A2,然后(递归地)解决A1和A2上的问题。这能帮你找到一个最佳的选择吗?别忘了你可以使用额外的处理,成本高达O(n)。假设p,q是A的最佳对。p,q∈A1,或p,q∈A2,或者这两种情况都不正确。在第三种情况下,关于
#define min_f(a, b) (a)>(b)?(b):(a)
#define max_f(a, b) (a)>(b)?(a):(b)
#define MAX 1 << 30
#define MIN -1
int get_min(int *a, int start, int end)
{
int t_min = MAX;
while(start <= end) {
t_min = min_f(t_min, a[start]);
start++;
}
return t_min;
}
int get_max(int *a, int start, int end)
{
int t_max = MIN;
while(start <= end) {
t_max = max_f(t_max, a[start]);
start++;
}
return t_max;
}
int foo(int *a, int start, int end)
{
int g_max = MIN;
int min, max, i;
for(i=0;i<=end;i++) {
min = get_min(a, start, i);
max = get_max(a, i+1, end);
if (max > min) {
g_max = max_f(g_max, max-min);
}
}
return g_max;
}
int main()
{
int a[] = {1,4,12,5,9,1,3,8};
int size = sizeof(a)/sizeof(a[0]);
printf("%d\n", foo(a, 0, size-1));
return 0;
}
定义最小值(a,b)(a)>(b)?(b):(a)
#定义最大值f(a,b)(a)>(b)?(a):(b)
#定义MAX 1您的递归解决方案只不过是一个例子,您还可以通过查找了解分治的基本概念 现在,让我们以你为例
[1,4,12,5,9,1,3,8]
/\
/ \
/ \
[1,4,12,5] [9,1,3,8]
如果您确实阅读了上面的链接,或者您知道分治算法,您将理解我们递归地对左子数组和右子数组执行操作。下一步是,我们再次将每个部分分开。在这里,让我们只做上半部分,它将足以进入第三种情况,这是你一无所知
拿前一半,再把它分开
[1,4,12,5]
/\
/ \
/ \
[1,4] [12,5]
在分割数组的这一步中,您应该已经了解了第三种情况。答案p=1(左半部分)和q=12(右半部分)位于除法后的不同半部分
这是第三起案件。现在,我让您自行编写递归代码,并在代码中适当地处理第三种情况 可以先在递归函数中找到最大值,然后以相同的方式找到最小值。在你找到不同之处之后。我认为你不可能只靠一个功能就成功
public static int diff(int[] arr)
{
int max=findMax(arr, 0, arr.Length - 1);
int min=findMin(arr, 0, arr.Length - 1);
return max-min;
}
private static int findMax(int[] arr, int index_begin, int index_end)
{
if (index_begin == index_end) return arr[index_begin];
int m = (index_begin + index_end) / 2;
return Math.Max(findMax(arr, index_begin, m), findMax(arr, m + 1,
index_end));
}
private static int findMin(int[] arr, int index_begin, int index_end)
{
if (index_begin == index_end) return arr[index_begin];
int m = (index_begin + index_end) / 2;
return Math.Min( findMin(arr, index_begin, m), findMin(arr, m + 1,
index_end));
}
闻起来像家庭作业。@mikeb:你为什么这么认为?我真的不喜欢那些不提问、不假设的人。不,我不会删除它,因为即使它不是“家庭作业”,你也应该试着自己解决它,当你陷入困境时,来这里。你来这里是想找人帮你做,而不是至少努力。尝试一下解决方案,我不仅会删除-1,还会帮助您解决这个问题。如果这是一个太难的问题,也许您应该解决一些更简单的问题,比如一个取数字n并返回斐波那契(n)的函数。这是一个典型的递归问题,应该让你开始学习。我已经读了你写的东西。你们给我们苹果,让我们用它来做橘子。你甚至都没试过。我没有复制粘贴,哈哈。如果你至少不尝试做你想做的事情,没有人会为你写作业。到目前为止你试过什么?您的示例代码应该做您想要做的事情,但没有给您预期的结果,它在哪里?不要只是粘贴一些工作代码,而是让别人转换它。发布一些损坏的代码,并询问如何修复它的一些提示,然后您可能会得到一些帮助。@mikeb:这是我最后的评论,让您明白我不是在寻找代码,而是在寻找想法。我只想知道当p和q在细分数组中都不好时,第三种情况是什么。