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;elsewhile (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;
}