100.相同的树
思路开始进入二叉树了,还是老样子直接开刷 这种题目似乎递归都很好用,判断当时,正确往下继续 因此 首先判断当前根结点,两者都为NULL相同,存一NULL不同,不为NULL判断是否相同 之后判断左孩子和右孩子是否都相同即可 代码: 1234567891011121314bool isSameTree(struct TreeNode* p, struct TreeNode* q) { if(p==NULL&&q==NULL){ return true; } else if(p==NULL||q==NULL){ return false; } else if(p->val!=q->val){ return false; } else{ return...
454.四数相加II
这题运用了分组+哈希,四个数组,每个出一个数,加起来要为0,要循环四次太慢了,我们分成两组,每组用一个二次循环,第一组将其值的负数存入哈希表并且计数防止重复,第二组在哈希表里查找,找到了count+=tmp->count; 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647struct hashTable{ int key; int count; UT_hash_handle hh;};struct hashTable* set=NULL;void clearHashTable(){ struct hashTable *current, *tmp; HASH_ITER(hh, set, current, tmp) { HASH_DEL(set, current); free(current); }}int...
383.赎金信
很简单的哈希表问题,由于是字母,只需要26个int的数组就可以,先遍历一遍magazine,一有出现就++ 之后再遍历ransomnote,当>0时–,当<0时return false 123456789101112131415bool canConstruct(char* ransomNote, char* magazine) { int nums[26]={0}; int lenr=strlen(ransomNote); int lenm=strlen(magazine); for(int i=0;i<lenm;i++){ nums[magazine[i]-'a']++; } for(int i=0;i<lenr;i++){ if(nums[ransomNote[i]-'a']>0){ ...
349.两个数组的交集
我的思路两者排序完先将nums1扔进哈希表,在遍历一遍nums2把找到的放入ans即可 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051struct hashTable{ int key; UT_hash_handle hh;};struct hashTable* set=NULL;void clearHashTable(){ struct hashTable *current,*tmp; HASH_ITER(hh,set,current,tmp){ HASH_DEL(set,current); free(current); }}int cmp(const void* a,const void* b){ return *(int*)a-*(int*)b;}int*...
242.有效的字母异位词
思路1.很笨的排序直接把他排序了再来对比就ok了 1234567891011121314 int cmd_char(const void* e1,const void* e2) { return (*(char*)e1-*(char*)e2); }bool isAnagram(char* s, char* t) { if(strlen(s)!=strlen(t)) { return false; } qsort(s,strlen(s),sizeof(char),cmd_char); qsort(t,strlen(t),sizeof(char),cmd_char); return strcmp(s, t) ==0;} 2.哈希表只有26个字母,因此用数组就好了 123456789101112131415161718192021bool isAnagram(char* s, char* t) { int...
202.快乐数
思路无限循环—->平方和出现相同的—->可以利用哈希表 算出 存入 为一返回true 重复返回false 123456789101112131415161718192021222324252627282930313233343536373839404142434445struct hashTable{ int key; UT_hash_handle hh;};struct hashTable* set=NULL;int getsum(int n){ int s=0; while(n){ s+=(n%10)*(n%10); n/=10; } return s;}void clearHashTable(){ struct hashTable *current, *tmp; HASH_ITER(hh, set, current, tmp) { HASH_DEL(set, current); ...
15.三数之和
思路直接遍历的话可能要O(n**3)时间复杂度太大了,我们需要应用哈希表尽量减小时间复杂度,但基本还是遍历,因此时间复杂度不会低 我们先排序来减少需要的时间,下一步就知道为什么了,c语言没有.sort,我又不想写一个快排,这里直接用qsort了,需要前置函数 1234int compare(const void* a,const void* b){ return (*(int*)a-*(int*)b);//升序排序}qsort(nums,sizeof(nums)/sizeof(nums[0]),sizeof(int),compare); 来两个指针,可以想到需要left遍历整个数组,当数组内容相同时直接跳过,因为我们已经排序好了,因此我们只需要: 1234if...
541.反转字符串II
思路1.我的代码比起反转字符串多了几个条件 定义两个指针left和right, 当len-left>2k时,right向右走k-1,然后反转 当len-left<k时,反转left到len-1 当len-left>=k&&len-left<2*k,反转left,left+k-1 代码 123456789101112131415161718192021222324252627282930void reverseString(char* s, int left,int right) { while(left<right){ char temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}char* reverseStr(char* s, int k) { int left=0; int right=0; ...
344.反转字符串
思路比起151这题真的是太简单了,同样不用库函数 1234567891011void reverseString(char* s, int sSize) { int left=0; int right=sSize-1; while(left<right){ char temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}
151.反转字符串中的单词
思路我们不优先使用库函数 首先我们先考虑前后空格 去除空格 让left向前走,right向后走,走到不是空格就好了,最后把剩下的存入到新数组里 12345678910111213char *removeKong(char *s){ int left=0; int right=strlen(s)-1; while(s[left++]==' '); while(s[right++]==' '); int new_length = right - left + 1; char *sb = (char *)malloc(new_length + 1); for(int i=0;i<right-left+1;i++){ sb[i]=s[left++]; } sb[left]='\0'; return sb;} 然后是去除中间多的空格 123456789101112在上面的代码中,添加一个条件判断 ...







