1.哈希表
常见的哈希表分为三类,数组,set,map,C语言的话是不是只能用数组和
2.例题
题目一:
分析:题目就是判断两个字符串出现的次数是否相同;
1)哈希表26个小写字母次数初始化为0;
2)遍历s字符串;字母次数++;遍历t字符串,字母次数–;
3)看hash是否全部为0? 为0说明s和t是字母异位词;
bool isAnagram(char * s, char * t){
int hash[26] = {0}; //注意这里必须初始化为0,不然用例过不了
int slen = strlen(s);
int tlen = strlen(t);
if (slen != tlen) {
return false;
}
// 统计s所有字母出现的频率在哈希表里
for (int i = 0; i < slen; i++) {
hash[s[i] - 'a']++;// -a就是字母下标做了一个映射 a就是0就是1;
}
// 如何比对t 呢? 遍历t数组的时候,看hash表是不是都是0了?如果是0 则说明两个数组元素相同;
for (int i = 0; i < tlen;i++) {
hash[t[i] - 'a']--;// 前一个++ 后一个-- 如果s t相同,hash肯定为0了
}
for (int i = 0; i < 26;i++) {
if (hash[i] != 0) {
return false;
}
}
return true;
}
题目二:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
int hash[1000] = {0};
int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;
int *result = (int *)malloc(sizeof(int)* lessSize);
int resultIndex = 0;
for(int i = 0; i < nums1Size; i ++) {
hash[nums1[i]]++;
}
for(int i = 0; i < nums2Size; i ++) {
if(hash[nums2[i]] > 0) {
result[resultIndex] = nums2[i];
resultIndex ++;
hash[nums2[i]] = 0;
}
}
* returnSize = resultIndex;//一定要赋值
return result;
}
题目三:
分析
1)三数之和,固定三个数,nums[i],nums[left] , nums[right] 就是求nums[i] + nums[left] + nums[right];
2)这个三个数都要去重,nums[i]去重,nums[i] == nums[i - 1] 不能写成 nums[i] == nums[i +1];因为i+1是left;
3)left 和 right去重;nums[left] == nums[left + 1] ;nums[right] == nums[right - 1]
int comp(const void* a,const void* b){
return *(int *)a - *(int *)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
qsort(nums,numsSize,sizeof(int),comp);//排序
int** res = malloc(sizeof(int*) * 18000);
* returnSize = 0;
int count = 0;
for (int i = 0; i < numsSize; i++) {
int left = i + 1;
int right = numsSize - 1;
if(nums[i] > 0) continue;
else if(i > 0 && nums[i] == nums[i - 1]) continue; //为啥是i-1要好好想想 i+1是left;
else
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
} else if (sum == 0) {
res[count]=malloc(sizeof(int) * 3);
res[count][0] = nums[i];
res[count][1] = nums[left];
res[count][2] = nums[right];
count++;
//剪枝--如果出现相同nums[left]或nums[right]的情况,就跳过
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
left++;
right--;
}
}
}
//设置返回参数
*returnSize = count;
*returnColumnSizes = malloc(sizeof(int) * count);
for(int i = 0; i < count; i++) {
returnColumnSizes[0][i]=3;
}
return res;
}