力扣(LeetCode)刷题,简单+中等题(第31期)
目录
第1题:同构字符串
第2题:最后一块石头的重量
第3题:最小路径和
第4题:键盘行
第5题:存在重复元素 II
第6题:两数相加
第7题:三个数的最大乘积
第8题:等价多米诺骨牌对的数量
第9题:公平的糖果棒交换
第10题:替换后的最长重复字符
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第1题:同构字符串
#define MAX_NUM 128bool isIsomorphic(char * s, char * t){int sLen = 0;int tLen = 0;int *hash1 = NULL;int *hash2 = NULL;sLen = strlen(s);tLen = strlen(t);// 特殊处理if (sLen != tLen) {return false;}// 分配空间hash1 = malloc(sizeof(int) * MAX_NUM);memset(hash1, 0, sizeof(int) * MAX_NUM);hash2 = malloc(sizeof(int) * MAX_NUM);memset(hash2, 0, sizeof(int) * MAX_NUM);// 统计字符串出现的次数for (int i = 0; i < sLen; i++) {if (hash1[s[i]] == 0) {hash1[s[i]] = t[i];}if (hash2[t[i]] == 0) {hash2[t[i]] = s[i];}if (hash1[s[i]] != t[i] || hash2[t[i]] != s[i]) {return false;}}return true;
}
第2题:最后一块石头的重量
int cmp(const void* _a, const void* _b){int a = *(int*)_a;int b = *(int*)_b;return b-a;
}int lastStoneWeight(int* stones, int stonesSize){if(stonesSize <=1){return stones[0];}qsort(stones,stonesSize,sizeof(int),cmp);while(stones[1] != 0){stones[0] = stones[0] - stones[1];stones[1] = 0;qsort(stones,stonesSize,sizeof(int),cmp);}return stones[0];
}
第3题:最小路径和
int minPathSum(int** grid, int gridSize, int* gridColSize) {int rows = gridSize, columns = gridColSize[0];if (rows == 0 || columns == 0) {return 0;}int dp[rows][columns];dp[0][0] = grid[0][0];for (int i = 1; i < rows; i++) {dp[i][0] = dp[i - 1][0] + grid[i][0];}for (int j = 1; j < columns; j++) {dp[0][j] = dp[0][j - 1] + grid[0][j];}for (int i = 1; i < rows; i++) {for (int j = 1; j < columns; j++) {dp[i][j] = fmin(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];}}return dp[rows - 1][columns - 1];
}
第4题:键盘行
/*** Note: The returned array must be malloced, assume caller calls free().*/
char ** findWords(char ** words, int wordsSize, int* returnSize){*returnSize=0;char **res=(char**)malloc(sizeof(char*)*wordsSize);char *a=(char*)calloc(59,sizeof(char));for(int i=0;i<58;i++){if(i=='Q'-65||i=='W'-65||i=='E'-65||i=='R'-65||i=='T'-65||i=='Y'-65||i=='U'-65||i=='I'-65||i=='O'-65||i=='P'-65||i=='q'-65||i=='w'-65||i=='e'-65||i=='r'-65||i=='t'-65||i=='y'-65||i=='u'-65||i=='i'-65||i=='o'-65||i=='p'-65)a[i]=1;else if(i=='A'-65||i=='S'-65||i=='D'-65||i=='F'-65||i=='G'-65||i=='H'-65||i=='J'-65||i=='K'-65||i=='L'-65||i=='a'-65||i=='s'-65||i=='d'-65||i=='f'-65||i=='g'-65||i=='h'-65||i=='j'-65||i=='k'-65||i=='l'-65)a[i]=2;elsea[i]=3;}int i,j;for(i=0;i<wordsSize;i++){for(j=1;j<strlen(words[i]);j++){char t=a[words[i][0]-65];if(t!=a[words[i][j]-65])break;}if(j==strlen(words[i])){res[*returnSize]=(char*)calloc(strlen(words[i])+1,1);strcpy(res[*returnSize],words[i]);(*returnSize)++;}}return res;
}
第5题:存在重复元素 II
bool containsNearbyDuplicate(int* nums, int numsSize, int k){if(numsSize==0)return false;int mark[numsSize];//Hash表memset(mark,-1,sizeof(int)*numsSize);for(int i = 0, tmp = 0; i < numsSize; i++){tmp=nums[i]%numsSize;//Hash函数if(tmp<0)//转换为正数tmp+=(numsSize-1);if(mark[tmp]==-1)//没有存数mark[tmp]=i;//存下数组下标else//已经存数{while(nums[mark[tmp]]!=nums[i])//发生冲突{tmp++;tmp%=numsSize;if(mark[tmp]==-1)//没有存数mark[tmp]=i;//存下数组下标}//已经存过该数if(i!=mark[tmp])if(i-mark[tmp]<=k)//求差值return true;elsemark[tmp]=i;}} return false;
}
第6题:两数相加
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){struct ListNode* pre = (struct ListNode*)malloc(sizeof(struct ListNode));pre->val = 0;pre->next = NULL;struct ListNode* cur = pre;int carry = 0;int sum = 0;while(l1 != NULL || l2 != NULL){int x = (l1 == NULL) ? 0:l1->val;int y = (l2 == NULL) ? 0:l2->val;sum = x + y + carry;carry = sum / 10;struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));p->val = sum % 10;p->next = NULL;cur->next = p;cur = cur->next;if(l1 != NULL){l1 = l1->next;}if(l2 != NULL){l2 = l2->next;}}if(carry == 1){struct ListNode* ca = (struct ListNode*)malloc(sizeof(struct ListNode));ca->val = carry;ca->next = NULL;cur->next = ca;} return pre->next;
}
第7题:三个数的最大乘积
如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
int maximumProduct(int* nums, int numsSize) {// 最小的和第二小的int min1 = INT_MAX, min2 = INT_MAX;// 最大的、第二大的和第三大的int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;for (int i = 0; i < numsSize; i++) {int x = nums[i];if (x < min1) {min2 = min1;min1 = x;} else if (x < min2) {min2 = x;}if (x > max1) {max3 = max2;max2 = max1;max1 = x;} else if (x > max2) {max3 = max2;max2 = x;} else if (x > max3) {max3 = x;}}return fmax(min1 * min2 * max1, max1 * max2 * max3);
}
第8题:等价多米诺骨牌对的数量
int numEquivDominoPairs(int** dominoes, int dominoesSize, int* dominoesColSize) {int num[100];memset(num, 0, sizeof(num));int ret = 0;for (int i = 0; i < dominoesSize; i++) {int val = dominoes[i][0] < dominoes[i][1] ? dominoes[i][0] * 10 + dominoes[i][1] : dominoes[i][1] * 10 + dominoes[i][0];ret += num[val];num[val]++;}return ret;
}
第9题:公平的糖果棒交换
假设数组 A 和 B 的元素之和分别为 sumA 和 sumB,待交换的元素分别为 x 和 y,则按照题目的要求必然存在以下等式成立:sumA - x + y = sumB + x - y
此时,这个问题就简化为:在数组中查找一个元素的值等于目标值 target 了。
/*** Note: The returned array must be malloced, assume caller calls free().*/
int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;
}int* fairCandySwap(int* A, int ASize, int* B, int BSize, int* returnSize){*returnSize = 0;int *res = (int *)malloc(2 * sizeof(int));/* 判断是否动态内存是否申请成功*/if (res == NULL) {return NULL;}*returnSize = 2;int sumA = 0, sumB = 0, diff = 0;/* 求数组 A 和 B 的和*/for (int i = 0; i < ASize; ++i) {sumA += A[i];}for (int j = 0; j < BSize; ++j) {sumB += B[j];} diff = sumA - sumB;/* 排序,为后面进行二分查找做准备 */qsort(A, ASize, sizeof(int), cmp);for (int k = 0; k < BSize; ++k) {/* 二分查找的目标元素 */int target = diff / 2 + B[k];int l = 0, r = ASize - 1;/* 二分查找 */while (l <= r) {int m = l + (r - l)/2;if (A[m] > target) {r = m - 1;} else if (A[m] < target) {l = m + 1;/* 查找到目标元素,对数组元素赋值并返回 */} else {res[0] = target;res[1] = B[k];return res;}}}return NULL;
}
第10题:替换后的最长重复字符
1、定义一个长度为 26 的整型数组(字符串仅包含大写英文字母),用于模拟哈希表(记录重复字母出现次数);
int characterReplacement(char * s, int k){int maxCnt = 0;int l = 0, r = 0; // 滑动窗口[l, r)int freq[26] = {0}; // 记录重复字符出现频次int lenS = strlen(s);while (r < lenS) {freq[s[r] - 'A']++; // 计算当前字符出现频次maxCnt = fmax(maxCnt, freq[s[r++] - 'A']); // 计算当前字符出现的最大频次 if (r - l > maxCnt + k) { // 滑动窗口大小大于字母最大频次加上能替换的次数freq[s[l++] - 'A']--; // l 右移动减少滑动窗口大小,同时频次减减}}return r - l;
}
力扣(LeetCode)刷题,简单+中等题(第31期)相关推荐
- Leetcode-How-What 力扣Leetcode刷题指南
Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...
- 力扣(LeetCode)刷题,简单+中等题(第26期)
目录 第1题:字典序排数 第2题:字符串解码 第3题:查找常用字符 第4题:所有奇数长度子数组的和 第5题:长按键入 第6题:分割字符串的最大得分 第7题:回文链表 第8题:有多少小于当前数字的数字 ...
- 力扣(LeetCode)刷题,简单+中等题(第35期)
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...
- 力扣(LeetCode)刷题,简单+中等题(第34期)
目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...
- 力扣(LeetCode)刷题,简单+中等题(第33期)
目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...
- 力扣(LeetCode)刷题,简单+中等题(第32期)
目录 第1题:数组的度 第2题:托普利茨矩阵 第3题:爱生气的书店老板 第4题:翻转图像 第5题:有效的数独 第6题:无重复字符的最长子串 第7题:区域和检索 - 数组不可变 第8题:二维区域和检索 ...
- 力扣(LeetCode)刷题,简单+中等题(第30期)
目录 第1题:单词规律 第2题:找不同 第3题:在排序数组中查找元素的第一个和最后一个位置 第4题:使用最小花费爬楼梯 第5题:寻找峰值 第6题:字符串中的第一个唯一字符 第7题:两个数组的交集 II ...
- 力扣(LeetCode)刷题,简单+中等题(第29期)
目录 第1题:分割数组为连续子序列 第2题:翻转矩阵后的得分 第3题:寻找旋转排序数组中的最小值 第4题:乘积最大子数组 第5题:不同路径 第6题:判断路径是否相交 第7题:摆动序列 第8题:单调递增 ...
- 力扣(LeetCode)刷题,简单+中等题(第28期)
目录 第1题:翻转单词顺序 第2题:顺时针打印矩阵 第3题:总持续时间可被 60 整除的歌曲 第4题:字符串的最大公因子 第5题:上升下降字符串 第6题:将数组分成和相等的三个部分 第7题:可被 5 ...
最新文章
- 关于reference to ‘XXXX’ is ambiguous的解决办法
- C# 操作Excel之旁门左道 [ C# | Excel ]
- Sql 2008 安装遇到的问题
- ua获取手机型号_无牌山寨手机的数据提取解决方案
- Hibernate数据保存操作方法的原理对比
- windows常见软件库
- vsftp匿名访问目录_VSFTP本地用户目录跟匿名用户目录肿么修改?
- C++ Ouput Exactly 2 Digits After Decimal Point 小数点后保留三位数字
- 你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?
- ZZULIOJ ASCII码排序(多实例测试)
- OVS 网桥的Patch端口学习笔记
- 《精通软件性能测试与LoadRunner最佳实战》—第1章1.1节软件测试基础
- android开发分页查询,Android开发中实现分页效果的简单步骤
- ubuntu开机直接进入命令行模式
- 学会Git玩转Github笔记(三)—— Github Pages 搭建个人网站
- 如何在H264数据中获取PTS?
- JAVA常见异常之NullPointerException 空指针异常
- 连续变量的描述统计与SPSS实现
- 【C++零散】计时chrono
- 全球人工智能产业链产业图谱
热门文章
- [JS][编程题]括号匹配
- HarmonyOS ToastDialog 的使用
- 微信小程序import和include
- 微信小程序提示 出现脚本错误或者未正确调用 Page()
- android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating
- window10 系统查看控制面板的方法
- Word文档以两列的格式打开,类似于书本那样
- php substr cnblog,php中substr用法示例
- 从面试官角度观察到的程序员工资瓶颈,同时给出突破瓶颈的建议
- django基础(一)