一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
- 线性表
2.2.3, 13
- 找最小正整数,所以不需要管负数
- 想法还是跟12题第一种解法一样,类似桶排序
- 开一个新数组,下标对应元素值,值对应元素是否出现
- 时间复杂度O(n),空间复杂度O(n),
竟然已经是最优解了?
int find_miss_min(SqList list) {
// 1.初始化一个全为0的数组
int tmp[list.length] = {0};
// 2.下标对应元素值,值对应元素是否出现
for (int i = 0; i < list.length; i++) {
if (list.data[i] > 0 && list.data[i] <= list.length)
tmp[list.data[i]]++;
}
// 3.找到最小正整数
int i;
for (i = 1; i < list.length; i++) {
if (tmp[i] == 0)
return i;
}
return i;
}
复制代码
2.2.3, 14
- 暴力,直接三重循环!
- 一个一个算,找到最小的
- 时间复杂度O(n3),时间复杂度O(1)
int find_min_distance(int A[], int B[], int C[], int n1, int n2, int n3) {
int dmin = INT_MAX, d;
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
for (int k = 0; k < n3; k++) {
// 计算距离
d = abs(A[i] - B[j]) + abs(B[j] - C[k]) + abs(C[k] - A[i]);
// 更新最小值
if (d < dmin) dmin = d;
}
}
}
return dmin;
}
复制代码
-
众所周知,绝对值体现的是数轴上的距离
-
当 a=b=c 时,距离最小
-
当 a<=b<=c 时,如图所示
-
决定D大小的因素就是c和a的距离,所以我们每次固定c找一个使距离最小的a就可以了
-
时间复杂度O(n),空间复杂度O(1)
// n1是否是三个数中的最小值
bool find_min(int n1, int n2, int n3) {
if (n1 <= n2 && n1 <= n3) return true;
return false;
}
int find_min_distance2(int A[], int B[], int C[], int n1, int n2, int n3) {
int dmin = INT_MAX, d, i = 0, j = 0, k = 0;
while(i < n1 && j < n2 && k < n3) {
// 计算距离
d = abs(A[i] - B[j]) + abs(B[j] - C[k]) + abs(C[k] - A[i]);
// 更新最小值
if (d < dmin) dmin = d;
if (find_min(A[i], B[j], C[k])) i++;
else if (find_min(B[j], C[k], A[i])) j++;
else k++;
}
return dmin;
}
复制代码
- 顺序表已经更完,明天继续更新链表