问题二:寻找石对 有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 19:01:41 浏览: 340
以下是用C语言编写的函数F,用于查找所有重量差为D的石头对:
```
#include <stdio.h>
#include <stdlib.h>
struct Stone {
int id;
int weight;
};
struct StonePair {
int id1;
int id2;
};
int compareStone(const void *a, const void *b) {
return ((struct Stone *)a)->weight - ((struct Stone *)b)->weight;
}
int compareStonePair(const void *a, const void *b) {
return ((struct StonePair *)a)->id1 - ((struct StonePair *)b)->id1;
}
struct StonePair* F(struct Stone *stones, int n, int d, int *len) {
// 对石头按重量从小到大排序
qsort(stones, n, sizeof(struct Stone), compareStone);
// 找出重量差为D的石头对
struct StonePair *pairs = (struct StonePair*)malloc(sizeof(struct StonePair) * n);
int pairCount = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (stones[j].weight - stones[i].weight == d) {
pairs[pairCount].id1 = stones[i].id;
pairs[pairCount].id2 = stones[j].id;
pairCount++;
}
}
}
// 对石头对按id1从小到大排序
qsort(pairs, pairCount, sizeof(struct StonePair), compareStonePair);
// 去除重复的石头对
int i = 0;
int j = 1;
while (j < pairCount) {
if (pairs[i].id1 == pairs[j].id1 && pairs[i].id2 == pairs[j].id2) {
j++;
} else {
i++;
pairs[i].id1 = pairs[j].id1;
pairs[i].id2 = pairs[j].id2;
j++;
}
}
*len = i + 1;
return pairs;
}
```
函数F的参数说明:
- stones:石头的数组,每个元素包括一个石头的id和重量。
- n:石头的数量。
- d:重量差的大小。
- len:返回的石头对的数量。
函数F的返回值是一个指针,指向包含所有重量差为D的石头对的数组。每个石头对包括两个id,分别表示这两个石头在原始石头数组中的下标。
函数F的时间复杂度是O(max(R, N) * log(N)),其中R是结果对数,N是石头数量。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)