realloc leetcode
时间: 2023-09-28 18:09:43 浏览: 229
realloc是C语言中的一个函数,用于重新分配之前通过malloc或calloc分配的内存块的大小。它可以用于动态地改变内存块的大小,以满足程序的需求。在引用中提到的两个LeetCode问题中,双指针法和realloc函数都被用于解决问题。
在LeetCode 16 最接近的三数之和问题中,双指针法可以帮助我们在数组中找到最接近目标值的三个数之和。具体的实现细节可以参考相关的C语言代码。
在LeetCode 18 四数之和问题中,基于三数之和的解法中使用了realloc函数来重新规划内存。具体的实现细节可以参考相关的C语言代码。
相关问题
leetcode realloc
引用中的代码是一个用于判断括号是否匹配的函数。该函数使用动态数组实现了一个栈结构,通过遍历字符串中的每个字符,将左括号入栈,遇到右括号时与栈顶元素进行匹配。如果匹配成功,则将栈顶元素出栈,继续遍历下一个字符;如果匹配失败,则返回false。最后,判断栈是否为空,如果为空则返回true,否则返回false。
在引用中的注释中,作者提到了关于数组大小的问题。作者认为,开辟(numsSize * numsSize)大小的数组是足够的,因为根据题目要求,需要找到三个数的和为0,那么假设a<b<c,那么必定有a<0且c>0。根据这个条件,假设数组中有x个负数和n-x个正数,那么a有x种可能的值,c有(n-x)种可能的取值。如果假设对于任意允许的a和c的取值都有对应的b存在(这是不存在的情况),那么所需空间就是n*(n-x)。因此,作者认为分配(numsSize * numsSize)大小的数组是足够的。
引用中的题解提到了解题思路。首先,题目要求找到三个数的和为0,将a当作求解两数之和的目标值。在穷举的前提下,可以使用双指针或二分查找进行优化。
综上所述,根据提供的引用信息,我们可以得出以下结论:引用中的代码是一个用于判断括号是否匹配的函数;引用中的注释提到了关于数组大小的问题;引用中的题解提到了解题思路。
leetcode:Group Anagrams 用c语言,只给代码
这是一个用C语言实现的LeetCode题目:Group Anagrams。
题目描述:
给定一个字符串数组,将其分组,使得包含相同字符的字符串在同一组中。返回结果应按照字母顺序排列。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
解题思路:
- 遍历字符串数组,将每个字符串转换为字符数组并排序。
- 使用哈希表将排序后相同的字符串分组。
- 遍历哈希表,将每个分组的字符串数组添加到结果数组中。
代码实现:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char *** groupAnagrams(char ** strs, int strsSize, int* returnSize, int** returnColumnSizes){
char ***res = (char ***)malloc(sizeof(char **) * strsSize);
*returnSize = 0;
*returnColumnSizes = (int *)malloc(sizeof(int) * strsSize);
int cnt[26] = {0};
int index = 0;
struct Node *hashTable[strsSize];
memset(hashTable, 0, sizeof(hashTable));
for (int i = 0; i < strsSize; i++) {
memset(cnt, 0, sizeof(cnt));
for (int j = 0; j < strlen(strs[i]); j++) {
cnt[strs[i][j] - 'a']++;
}
char *key = (char *)malloc(sizeof(char) * 27);
int idx = 0;
for (int j = 0; j < 26; j++) {
if (cnt[j] != 0) {
key[idx++] = j + 'a';
key[idx++] = cnt[j] + '0';
}
}
key[idx] = '\0';
int hash = getHash(key);
if (hashTable[hash] == NULL) {
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->key = key;
node->next = NULL;
node->strings = (char **)malloc(sizeof(char *));
node->strings[0] = strs[i];
node->count = 1;
hashTable[hash] = node;
} else {
struct Node *p = hashTable[hash];
while (p != NULL) {
if (strcmp(p->key, key) == 0) {
p->count++;
p->strings = (char **)realloc(p->strings, sizeof(char *) * p->count);
p->strings[p->count - 1] = strs[i];
break;
}
p = p->next;
}
if (p == NULL) {
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->key = key;
node->next = hashTable[hash];
node->strings = (char **)malloc(sizeof(char *));
node->strings[0] = strs[i];
node->count = 1;
hashTable[hash] = node;
}
}
}
for (int i = 0; i < strsSize; i++) {
if (hashTable[i] != NULL) {
struct Node *p = hashTable[i];
while (p != NULL) {
res[index] = p->strings;
(*returnColumnSizes)[index] = p->count;
(*returnSize)++;
p = p->next;
index++;
}
}
}
return res;
}
int getHash(char *key) {
int hash = 0;
for (int i = 0; i < strlen(key); i++) {
hash = (hash * 31 + key[i]) % 100000;
}
return hash;
}
struct Node {
char *key;
struct Node *next;
char **strings;
int count;
};
阅读全文