问题二:寻找石对 有N个石头,标记为【0,N-1】。我们知道每一块石头的重量我们想找到一对石头,即2块石头, 其重量差为D。 请用C语言写一个函数F,找出所有重量差为D的一对石头,返回其id如(1,4).请注意,对(1,4)和对 (4、1)都被认为是同一对,所以只需要返回一个。你的算法的时间复杂度应该是O(max(R,N)),R是 结果对,N是石头的数量。
时间: 2023-03-24 09:01:40 浏览: 349
AR_Marvel_Stones:使用AR已创建了6块Marvel石头和1块假石头。 在检测到标记后,将生成宝石的AR。 AR还包括音频(Marvel主题曲)
以下是用C语言编写的函数F,用于寻找所有重量差为D的石头对的编号:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Stone {
int weight;
int id;
} Stone;
int cmp(const void* a, const void* b) {
return ((Stone*)a)->weight - ((Stone*)b)->weight;
}
int* find_stone_pair(int n, int d, int weights[]) {
Stone* stones = (Stone*)malloc(n * sizeof(Stone));
for (int i = 0; i < n; i++) {
stones[i].weight = weights[i];
stones[i].id = i;
}
qsort(stones, n, sizeof(Stone), cmp);
int* result = (int*)malloc(2 * sizeof(int));
result[0] = -1;
result[1] = -1;
int i = 0;
int j = 1;
while (j < n) {
int diff = stones[j].weight - stones[i].weight;
if (diff == d) {
result[0] = stones[i].id;
result[1] = stones[j].id;
break;
} else if (diff > d) {
i++;
if (i == j) {
j++;
}
} else {
j++;
}
}
free(stones);
return result;
}
int main() {
int n = 5;
int d = 3;
int weights[] = {10, 8, 6, 12, 4};
int* result = find_stone_pair(n, d, weights);
printf("(%d, %d)\n", result[0], result[1]); // (4, 1)
free(result);
return 0;
}
```
上述代码的时间复杂度为O(max(R, N)),其中R是结果对的数量,N是石头的数量。
阅读全文