思路
采用递归求解,对于树tree的深度,其值为:
Depth(tree) =
max(Depth(tree的左子树),Depth(tree的右子树)),tree != NULL
0,tree == NULL
求解最长递增子串可分为两种情况,即子串连续或非连续。
例如,对于整数串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4}
其连续递增子串为{2,4,6,7,8},非连续递增子串为{ {-1},{1},{2,4,6,7,8}}
采用动态规划思想,令
lengthOfSubList[k]表示子串{list[0]…list[k]}中最长的连续递增子串长度
lengthOfSubListIncludeK[k]表示子串{list[0]…list[k]}中以list[k]结尾的最长连续递增子串长度
indexOfLastElement[k]表示子串{list[0]…list[k]}中最长的连续递增子串的最后一个元素的位置
则
lengthOfSubListIncludeK[k] =
lengthOfSubListIncludeK[k-1]+1,list[k]>=list[k-1]
1,list[k]<list[k-1]
lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])
indexOfLastElement[k] =
k,lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]
indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]
如题,给出链表反转的递归和非递归算法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Node *reverse (Node *head)
{
Node *p1=NULL,*p2=NULL,*p3=NULL;
if(NULL == head || NULL == head->next)
return head;
p1=head;
p2=p1->next;
head->next=NULL;
while(!p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
return p2;
};