1、不能使用数学库max
解决方法:自定义
#define max(x, y) ((x > y) ? x:y)
2、全局变量int visited[MAX][MAX] = {{0}};默认不会初始化, 需要显示初始化
不能直接使用超大的局部变量数组,需要动态申请
解决方法
1、二维显示初始化
for (i=0; i<m; i++)
for (j=0; j<n; j++)
visited[i][j] = 0;
2、使用动态数组
/* Alloc all elements of array[x][y]
0 -- -- > x/m
|
v
y/n **/
int** AllocMap(int x, int y) {
int m;
int **map = (int **)calloc(sizeof(int *), x);
for (m=0; m<x; m++)
map[m] = (int *)calloc(sizeof(int), y);
return map;
}
3、技巧:获取链表的中间结点(快慢指针法)
struct TreeNode *addNote(int val) {
struct TreeNode *newNote = (struct TreeNode *)calloc(sizeof(struct TreeNode), 1);
newNote->val = val;
newNote->left = NULL;
newNote->right = NULL;
return newNote;
}
struct ListNode *getMedim(struct ListNode *head, struct ListNode *end) {
struct ListNode *step1 = head;
struct ListNode *step2 = head;
while (step2 != end && step2->next != end) {
step1 = step1->next;
step2 = step2->next->next;
}
return step1;
}
4、LeetCode采用多线程,因此在处理第二个样例时并不会将全局变量清零;前面的计算结果会遗留,导致结果随机性==》解决方法:全局变量显示全部清零
5、使用二维指针,看作是一个可变长度的指针数组,可以用于记录指针结点。此时可以作为一个一维数组访问。
int** pathSum(struct TreeNode* root, int target, int* returnSize, int** returnColumnSizes){
int size = 10;
struct TreeNode**mem = (struct TreeNode**) calloc (size, sizeof (struct TreeNode*));
printf ("%p %p\n", mem[0], mem[1]);
printf ("%p %p\n", &mem[0], &mem[1]);
mem[0] = root;
mem[1] = root->left;
printf ("%p %p\n", mem[0], mem[1]);
printf ("%p %p\n", &mem[0], &mem[1]);
return mem;
}
6、leetCode中qsort输入参数可能不支持二维数组(原因: AddressSanitizer相关),可以转换为结构体数组。比如
element array[salesSize];
for (int i = 0; i < salesSize; i++) {
array[i].a = sales[i][0]; array[i].b = sales[i][1];array[i].c = sales[i][2];
array[i].num = i;
}
// 升序排列,qsort只有大于1的才交换
int comp(const void* a, const void* b) {
element saleA = *(element*)a;
element saleB = *(element*)b;
int key[3];
key[0] = saleA.b - saleB.b; // 成本
key[1] = saleA.c - saleB.c; // 利润
key[2] = saleA.num - saleB.num; // 序号
for (int i=0; i<3; i++) {
if (key[i] != 0) {
return key[i];
}
i++;
}
}
7、Leetcode中的HASH使用,第二个参数必须要和结构体中定义的成员变量名一致,也就是这个局部变量的名称不能是随意的
typedef struct HashNode {
int key1;
int pos;
UT_hash_handle hh;
} Node;
Node* g_users = NULL; // 全局变量需要'函数内'新初始化
for (int i=0; i<nums2Size; i++) {
Node* s1 = (Node*)malloc(sizeof(Node));
int key = nums2[i];
s1->key1 = key;
s1->pos = i;
HASH_ADD_INT(g_users, key, s1);
}
8、Leetcode240: , 注意qsort和bsearch定义的比较函数是有区别的,qsort只关注>0的做交换,而不需要关注等于。而bsearch可能查找失败,因此还关心等于,因此后续定义comp建议用相减,而不用比较操作。
9、给定的HASH接口中HASH_FIND_STR((Node *)pTable, &value, node)获取的node->count记录指定单元素的个数,而HASH_COUNT((Node *)pTable) 记录整个Hash的总元素个数 (重复的元素插入数量也是增加,因此大部分代码中避免重复插入一般使用HASH_FIND_STR确认是否已经存在?)
#include <uthash.h>
typedef struct HashNode {
char value[12];
int count;
UT_hash_handle hh;
} Node;
参考https://oj.rnd.huawei.com/problems/1790/submissions
注意:字符串的hash 查找接口HASH_FIND_STR
a) 如果使用HASH_FIND_INT编译不提示错误,但是返回接口可能莫名其妙
b) 对STR类型的的HashNode结构体中定义的字符串,需要确保字符串以'\0'结尾
10、HASH_DEL 、HASH_SORT 和 HASH_ADD_INT 接口会变更hash内的数据,因此不能经过指针中转,比如
int sort (Leaderboard* obj) {
Node *pTable = obj->pTable;
HASH_SORT (obj->pTable, cmp); // 排序成功
HASH_SORT (pTable, cmp); // 排序不成功, cmp 同快速排序
}