1.
2.
3. 4.
5.
6.
7.
#include <iostream>
using namespace std;
int main(){
const int SIZE = 100;
int height[SIZE], num[SIZE], n, ans;
cin>>n;
for (int i = 0; i < n; i++) {
cin>>height[i];
num[i] = 1;
for (int j = 0; j < i; j++) {
if ((height[j] < height[i]) && (num[j] >= num[i]))
num[i] = num[j]+1;
}
}
ans = 0;
for (int i = 0; i < n; i++) {
if (num[i] > ans) ans = num[i];
}
cout<<ans<<endl;
}
最长上升子序列是就是输入为n的整数序列求出整数序列的长度
8.
void swap1(int p){
int i, j, b[SIZE];
for (i = 1; i <= p; i++)
b[ ① ] = a[i];
for (i = p + 1; i <= n; i++)
b[i - p] = ② ;
for (i = 1; i <= ③ ; i++)
a[i] = b[i];
}
void swap2(int p){
int i, j, temp;
for (i = p + 1; i <= n; i++) {
temp = a[i];
for (j = i; j >= ④ ; j--)
a[j] = a[j - 1];
⑤ = temp;
}
}
总共给出了两种算法一种是普通的交换,另一种是用时间复杂度,换空间复杂度的做法,第一个
第一种是O(n),第二种时间是O(n^2)空间是0(1)
9.
#include <iostream>
using namespace std;
const int SIZE = 100;
const int INFINITE = 1000000;
struct node {
int left_child, right_child, value;
};
node a[SIZE];
int is_bst(int root, int lower_bound, int upper_bound){
int cur;
if (root == 0)return 1;
cur = a[root].value;
if ((cur > lower_bound) && ( ① ) &&
(is_bst(a[root].left_child, lower_bound, cur) == 1) && (is_bst(②,③,④) == 1))
return 1;
return 0;
}
int main(){
int i, n;
cin>>n;
for (i = 1; i <= n; i++)
cin>>a[i].value>>a[i].left_child>>a[i].right_child;
cout<<is_bst( ⑤ , -INFINITE, INFINITE)<<endl;
return 0;
}
left和right都是左孩子和有孩子这是一个二分查找树,初始时从根结点出发,leftbound和right都初始化为无穷大如果是左子树就修改cur如果是右子树也修改cur如果是root就说明树空也就说明找到了
10。