实际问题分析

1.S集合包含n个正整数,并且∑S=2m,在S中是否存在子集T,有∑T=m

2.任给数组A[0,n),将其前后颠倒

统一接口:void reverse(int *A,int lo,int hi)

递归版:

if(lo<hi)
{
    swap(A[lo],A[hi]);
    reverse(A,lo+1,hi-1):
}

 3.从数组区间A[lo,hi)找出最大的两个整数A[x1]和A[x2]

思路1:第一趟循环中找出最大值位置x1,然后在[lo,x1)和[x1,hi)两个区间中分别循环,找出除x1位置之外的最大的两个值,两者取其大者则为第二大值,T(n)=2n-3

思路2:采用两个指针x1,x2分别维护最大值和次大值,初始时分别指向前两个值,一趟扫描中,依次取数组中的元素分别与x1,x2两个值进行比较,并根据比较情况进行替换

T(n)=n-1或者T(n)=2n-3

思路3:递归+分治,分别求出子数组的最大元素和次大元素

原文地址:https://www.cnblogs.com/lvjygogo/p/8519376.html