数据结构进阶实训六 多维数组

数据结构进阶实训六 多维数组

Data structure advanced training course notes and algorithm exercises

Source Code: https://github.com/MysticalGuest/DataStructure/tree/master/AdvancedJuniorTraining



题目1

1
2
3
我们把只包含因子2,3,5的数称为丑数。求从小到大的第1500个丑数。
-例如:6,8都是丑数,但14不是丑数,因为它包含因子7.习惯上我们把1当做丑数。
-编写尽可能高效的算法。提示:(可以用空间换时间)

1.1 算法设计思想

准备一个数组,初始化第1个丑数的下标0,值1;
然后1X2得到2,就是第2个丑数;
然后1X3得到3,就是第3个丑数;
不能直接1X5就是第4个丑数,因为还有一个丑数2X2=4;
所以难点就是判断中间丑数,然后存储在数组中;往下循环;
然后1X5得到5,就是第5个丑数

1.2 源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int min_num(int n1,int n2,int n3){
int min=(n1<n2)?n1:n2;
min=(min<n3)?min:n3;
return min;
}

void solution(long int array[]){
int i;
int t2=0;//记录M2的下标
int t3=0;
int t5=0;

for(i=1; i<1500; i++){
while(array[t2]*2<=array[i-1])//查找到新的M2,即乘以2后第一个大于M的数
t2++;
while(array[t3]*3<=array[i-1])
t3++;
while(array[t5]*5<=array[i-1])
t5++;
int min=min_num(array[t2]*2, array[t3]*3, array[t5]*5);
array[i]=min;
}
}

1.3 运行情况截图

DS



题目2

1
顺时针打印矩阵

2.1 算法设计思想

针对一般矩阵,先顺时针打印最外部一圈,
那么这个矩阵去掉外部一圈,内部也是一个小矩阵;
按照这样的规律,依次打印最外部一圈就可以了

2.2 源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void PrintMatrix(int (*num)[4], int col, int row, int layer){
int i;
int new_col = col - layer;
int new_row = row - layer;
for(i=layer; i<new_col; i++){ // 从左至右打印第一行
printf("%d ", num[layer][i]);
}
if(new_row>layer){
for(i=layer+1; i<new_row; i++){ // 从上至下打印最右一列
printf("%d ", num[i][new_row-1]);
}
}
if(new_col-1>layer && new_row-1>layer){
for(i=new_col-2; i>=layer; i--){ // 从右至左打印最后一行
printf("%d ", num[new_col-1][i]);
}
}
if(new_col-1>layer && new_row-1>layer+1){
for(i=new_row-2; i>layer; i--){ // 从下至上打印最左一列
printf("%d ", num[i][layer]);
}
}
}

2.3 运行情况截图

DS



题目3

1
2
3
设二维数组B[0..m-1][0..n-1]的数据在行、列方向上都按从小到大的顺序有序,
且x在B中存在。试设计一个算法,找出x在B数组中的位置i,j。
要求比较的次数不超过m+n

3.1 算法设计思想

第一个循环(最多4次):

将要定位的元素与每一行的最后一个元素比较,如果小于等于最后一个元素就结束循环,此时的i值就是元素的行坐标;

第二次循环(最多5次):

将要定位的元素与每一列的所有元素比较,如果小于等于这个值,就结束循环,此时的j值就是元素的列坐标

3.2 源代码

1
2
3
4
5
6
7
8
9
int matrix[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}, i, j;
for(i=0; i<4; i++){ // 定位行坐标i
if(obj <= matrix[i][4])
break;
}
for(j=0; j<5; j++){ // 定位列坐标j
if(obj <= matrix[i][j])
break;
}

3.3 运行情况截图

DS


评论