/* 初始化数组为 0 */ voidinitZero(int *nums, int numsSize){ int i = 0; while(i < numsSize) nums[i++] = 0; }
/* 交换数组下标 i,j 对应的值 */ voidswap(int *nums, int i, int j){ int t = nums[i]; nums[i] = nums[j]; nums[j] = t; }
/* 另一个等价的方法,不过调用时格式为 swap(&nums[i], &nums[j]) */ voidswap(int *ni, int *nj){ int t = *ni; *ni = *nj; *nj = t; }
/* 返回关键字首次出现的位置,未找到返回 -1 */ intfind(int *nums, int val){ int i, length; length = sizeof(nums) / sizeof(int); for (i = 0; i < length && nums[i] != val; i++) ; if (i == length) return-1; else return i; }
/* 倒转数组 */ voidreverse(int *nums, int begin, int end){ int i = begin;
/* 返回数组中的最大值 */ intmaxNumber(int *nums, int numsSize){ int i, max; for (i = 0, max = INT_MIN; i < numsSize; i++){ if (max < nums[i]) max = nums[i]; } return max; }
/* 返回数组中最大值的下标 */ intmaxIndex(int *nums, int numsSize){ int i, max, maxi; for (i = 0, max = INT_MIN; i < numsSize; i++){ if (max < nums[i]){ max = nums[i]; maxi = i; } } return maxi; }
/* 对数组中所有数加 val */ voidaddVal(int *nums, int numsSize, int val){ int i = 0; while(i < numsSize) nums[i++] += val; }
从位置 i 插入一个数(假设数组长度足够)
voidinsert(int *nums, int i, int numsSize, int data){ /* 下标从后到i,各向右移动一位,若从i开始向右移动,则需要保存下一个数的值,否则会因覆盖丢失 */ int cur = numsSize; /* numsSize为当前存储的数据长度 */ while(cur-- > i) nums[cur + 1] = nums[cur]; nums[cur + 1] = data; /* 此时cur = i-1,故需要+1在位置 i 处插入数据(当然,直接 nums[i] 也可) */ }
/* 对于所有情况 */ voidaddVal(int *nums, int numsSize, int val); int* topKFrequent(int* nums, int numsSize, int k){ /* 思路同上,只是先对数组做个预处理,让其中的值必然大于0 */ int i, cur, maxi;
int max = abs(maxNumber(nums, numsSize)); /* 取其绝对值是为了处理存在负数的情况 */ addVal(nums, numsSize, max); int numsTimes[2 * max + 1]; /* 2*max+1 是因为此时 nums 数组中最大的是 max+|max|,+1 是为了直接以其值作为索引,省去后续为了不越界的 -1 操作 */ initZero(numsTimes, 2 * max + 1); for (i = 0; i < numsSize; i++){ cur = nums[i]; ++numsTimes[cur]; } int *frequent = (int *)malloc(sizeof(int) * k); i = 0; while(i < k){ maxi = maxIndex(numsTimes, 2*max+1); frequent[i++] = maxi - max; /* 需 -max, 对应于原 nums 中的值 */ numsTimes[maxi] = 0; }
return frequent; }
一个更简洁的表达方式(但会多 o(k) 的时间)
intmaxNumber(int *nums, int numsSize); intmaxIndex(int *nums, int numsSize); voidinitZero(int *nums, int numsSize); int* topKFrequent_pos(int* nums, int numsSize, int k);
/* 是上面方法的汇总 */ int* topKFrequent(int* nums, int numsSize, int k){ int max = abs(maxNumber(nums, numsSize)); addVal(nums, numsSize, max); int *frequent = topKFrequent_pos(nums, numsSize, k); addVal(frequent, k, -max); /* 该语句为多余时间来源 */ return frequent; }
链表
节点定义
/* 链表节点结构体定义 */ structListnode{ int val; structListnode *next; };