
Leetcode刷题集
算法
柳家山头号矿工
如果你喜欢数学,那我们就是朋友!!!
展开
-
Leetcode题库1492. n 的第 k 个因子(python 实现)
,原创 2022-06-01 21:47:45 · 113 阅读 · 0 评论 -
Leetcode题库396. 旋转函数(python 实现)
文章目录思路代码思路这道题若用暴力做法可能超时,其规律性较强,可利用前面的计算结果来计算当前状态的结果例:nums = [4,3,2,6]F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16…F(0) 中 (0 * 4) + (1 * 3) + (2 * 2)与 F(1) 中 (1原创 2022-05-31 07:37:05 · 159 阅读 · 0 评论 -
Leetcode题库1022. 从根到叶的二进制数之和(dfs c 实现
文章目录思路func函数:二叉树分类补充代码思路func函数:接收参数:节点,一个整数Sum返回值:节点构成二进制数之和 + 2*Sum二叉树分类1、root = NULL返回结果为02、root->left = NULL, root->right = NULL返回结果为2*Sum + root->val3、root->left != NULL, root->right = NULL返回结果为func(root->left, temp + ro原创 2022-05-30 08:37:50 · 92 阅读 · 0 评论 -
Leetcode题库468.验证IP地址(python 实现
文章目录说明代码说明这道题需要用到正则的知识,遗憾的是我还没学,所以只能面向测试编程了doge代码也就图一乐,家人们别仔细看了代码def strhex_cutf0(s_hex,s_split): s_hex = list(s_hex.lstrip('0')) s_hex.reverse() flag = 0 ret = 0 time = 1 for i in s_hex: try: temp = int(i)原创 2022-05-29 09:57:34 · 212 阅读 · 0 评论 -
Leetcode题库1021. 删除最外层的括号(python 实现)
思路使用栈进行原语化分解例:s = “(()())(())”创建保存原语的列表S = []创建栈stack = []flag = 0遍历s,若值为s[i] = ‘(’ 则加入stack,若值为s[i] = ‘)’ 则从stack尾部弹出一个数据判断stack若为空,则将s[flag:i+1]插入S尾部,flag = i + 1重复上述步骤,直至遍历s结束上述操作结束后S = [‘(()())’, ‘(())’]只需要将S中每一个元素两边的括号去掉组成新的字符串返回即可代码class原创 2022-05-28 07:00:26 · 375 阅读 · 0 评论 -
Leetcode题库面试题 17.11. 单词距离(python 实现)
文章目录思路例可优化代码思路例words = [“I”,“am”,“a”,“student”,“from”,“a”,“university”,“in”,“a”,“city”]word1 = “a”word2 = “student”遍历words记录word1、word2出现的位置loc = [[2, ‘a’], [3, ‘student’], [5, ‘a’], [8, ‘a’]]遍历loc,获取两单词的最短距离可优化上述方案需要两次遍历,实际上只需一次即可设最小值为 ret = wo原创 2022-05-27 20:37:49 · 129 阅读 · 0 评论 -
Leetcode题库23. 合并K个升序链表(python 实现)
文章目录思路流程可优化代码思路流程1、根据每个链表中第一个元素对链表进行顺序排序2、对排好序的列表,取其第一个链表中的第一个元素,放入ret链表3、将第一个链表中的第一个元素移除,若移除后该链表为空则从列表中移除该链表4、此时列表中链表的顺序因为第一个链表中的第一个元素已经改变而被打乱,所以需要将第一个链表插到合适的位置,使得列表保持顺序,然后循环进行上述操作直至列表长度为零可优化1、创建0~n顺序到链表下标的一个映射,可以直接操作key到index的映射达到排序的目的,从而避免因排序需要原创 2022-05-26 09:03:27 · 238 阅读 · 0 评论 -
Leetcode题库1929. 数组串联
文章目录说明举例思路解释:说明看到这道题的一瞬间,我就在想是不是我理解错了,看了看评论,确实就是这么简单普通写法没啥意思,这里提供一个我自己的想法,不一定有效 doge举例思路题目要求ans[i] == nums[i]ans[i + n] == nums[i]看到这表达式就想到了mod运算举个例子家人们好理解nums = [1, 2, 1]先写一个类类中成员:Nums:是一个数组Length:记录Nums数组长度初始化方法传递一个数组以及其长度,将这个数组复制一份给nums原创 2022-05-25 07:31:06 · 221 阅读 · 0 评论 -
Leetcode题库404. 左叶子之和(递归 c实现)
文章目录思路代码思路0、提示下面的代码在leetcode上通不过原因是这样一棵树:12 34 5官方给出的答案:4我给出的答案:6也许是我对题目理解有问题,或者说[1,2,3,4,5]表示的二叉树不是上面那一棵,我的代码是2+41、函数作用sumOfLeftLeaves函数的作用:给定节点返回以该节点为顶点的二叉树的左叶子之和2、递归式root左叶子之和=root左节点val+其左节点为顶点的二叉树的左叶子之和+其右节点为顶点的二叉树的左叶子之和3、编原创 2022-05-24 07:33:11 · 172 阅读 · 0 评论 -
Leetcode题库175. 组合两个表(mysql实现)
文章目录思路1、连接选择2、连接方式3、新表列序代码思路1、连接选择Person表中可做为外键的有PersonIdAddress表中可做为外键的有Addrees、PersonId因为需要合并两表,于是选择PersonId作为连接2、连接方式题目要求若地址不存在,Person信息保留,地址以null表示,意味着连接方式为左外连接或者右外连接,由新表列顺序可知为左外连接3、新表列序题目要求:姓、名、城市和州代码select FirstName, LastName, City, State原创 2022-05-23 07:27:06 · 177 阅读 · 0 评论 -
Leetcode题库剑指 Offer 24. 反转链表(头插法 c实现)
文章目录思路方法1:头插法方法2:递归代码头插法思路方法1:头插法ret为返回链表的头部head_last指向下一个加入ret的节点每次将head取出使用头插法将其插入ret然后head=head_last, head_last=head->next如此循环直至head_last为NULL举例:head_last: 2 -> 3head: 1 #将head插入ret链表ret: 1head: 2 -> 3head_last: 3head: 2 #将head插入r原创 2022-05-22 08:00:02 · 453 阅读 · 0 评论 -
Leetcode题库1903. 字符串中的最大奇数(python实现)
文章目录思路代码思路长度越长数值越大,末尾数字为奇数,这个数字就是奇数,于是可以从后向前遍历,搜寻到第一个奇数就是最大的奇数代码class Solution: def largestOddNumber(self, num: str) -> str: res = None for i in range(len(num)-1,-1,-1): if int(num[i])%2: res = num[:i+原创 2022-05-21 07:39:31 · 400 阅读 · 0 评论 -
Leetcode题库1748. 唯一元素的和(c实现)
文章目录思路代码思路数组元素范围1~100,直接建立hash数组,最后遍历数组,取出值为1的下标值相加可改进:1、改用状态转移,可将遍历次数降至一次(遍历次数降低,但指令级的时间复杂度未大幅度减少)2、此处元素范围较小,可以直接作为下标,元素范围过大时,可建立映射表,降低空间复杂度代码int sumOfUnique(int* nums, int numsSize){ int Hash[101],Res=0; for(int i =0;i<101;i++){Hash[i]=原创 2022-05-20 06:55:10 · 496 阅读 · 0 评论 -
Leetcode题库338. 比特位计数(python实现)
文章目录思路代码思路方法1:每个数字单独计算比特位中1的数量方法2:利用已计算的结果计算当前数字比特位中1的数量 链接代码def func(n): ret=0 while(n>0): r = n % 2 n = (n - r)/2 ret+=r return int(ret)class Solution: def countBits(self, n: int) -> List[int]:原创 2022-05-19 07:11:47 · 253 阅读 · 0 评论 -
Leetcode题库1491. 去掉最低工资和最高工资后的工资平均值(c实现)
文章目录思路代码思路一次遍历,获取工资之和、最低工资、最高工资最后工资之和-最低工资-最高工资,除以(salarySize-2)可改进:先求工资之和再求平均值可能会数值过大导致越界(该题未考察)将求和替换为:Ave_Sum+=salary[i] / (salarySize-2)最后Ave_Sum - =(Max+Min) / (salarySize-2)向上面这样处理可保证Ave_Sum始终处于较小的状态代码double average(int* salary, int salarySi原创 2022-05-18 07:11:20 · 231 阅读 · 0 评论 -
Leetcode题库面试题2085. 统计出现过一次的公共字符串(python实现)
文章目录思路代码题目变形:统计出现过一次的公共字符数量(c实现)思路有手就行 doge代码class Solution: def countWords(self, words1: List[str], words2: List[str]) -> int: ret=0 for i in words1: if words1.count(i)==1 and words2.count(i)==1: ret+原创 2022-05-17 07:48:19 · 199 阅读 · 0 评论 -
Leetcode题库面试题 04.02. 最小高度树(c实现)
文章目录思路代码思路第一步:若low>high则直接返回空节点否则进行下一步第二步:medium=(high+low)/2=2第三步:将nums[medium]赋予当前节点的val当前节点的左子树负责安排nums数组中medium之前的数当前节点的右子树负责安排nums数组中medium之后的数第四步:返回当前节点代码struct TreeNode* F(int* nums, int low, int high){ struct TreeNode *t; i原创 2022-05-16 07:44:11 · 227 阅读 · 0 评论 -
Leetcode题库面试题 02.06. 回文链表(c实现)
文章目录思路代码思路核心思想:利用递归以达到从链表尾部开始遍历,直至链表头部第一步:递归,使得p1指向链表尾部第二步:比较p1与p2(p2从链表头部开始遍历)的val,若两者不等,则ret=0代码int ret=1;struct ListNode* f(struct ListNode* head,struct ListNode* p1,struct ListNode* p2){ if(p1->next!=NULL) p2=f(head,p1->next,p2);原创 2022-05-15 07:41:40 · 244 阅读 · 0 评论 -
Leetcode题库1464. 数组中两元素的最大乘积(c实现)
文章目录思路代码思路方法1:直接排序,最大的两个值在数组尾部或者头部时间复杂度>=O(nlogn)方法2:只需要最大的两个数,那就遍历数组,先将数组头部两个数默认为最大的两个数,再根据数组的遍历值对这两个数进行调整时间复杂度=O(n)代码int maxProduct(int* nums, int numsSize){ int num_0=nums[0],num_1=nums[1]; for(int i=2;i<numsSize;i++){ if(原创 2022-05-14 07:29:40 · 368 阅读 · 0 评论 -
Leetcode题库387. 字符串中的第一个唯一字符(c++实现)
文章目录思路代码思路第一步:创建hash数组遍历字符串,将字符数量统计出来第二步:题目要求返回第一个不重复的字符,那么我们就再遍历一次字符串,遍历的同时,在hash数组中查询当前字符的数量,若为1则保存其下标,跳出循环代码class Solution {public: int firstUniqChar(string s) { int Hash[26],s_length=s.length(),ret=-1,i; for(i=0;i<26;i++原创 2022-05-13 07:19:01 · 276 阅读 · 0 评论 -
Leetcode题库1523. 在区间范围内统计奇数数目(c实现)
文章目录思路代码思路分类讨论:1、两边界存在奇数(high-low)/2+12、两边界不存在奇数(high-low)/2代码int countOdds(int low, int high){ return (high-low)/2+(low%2==1 || high%2==1);}原创 2022-05-12 07:57:52 · 143 阅读 · 0 评论 -
Leetcode题库57. 插入区间(python实现)
文章目录思路代码思路第一步:将待插入数组插入到合适的位置例:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]]newInterval = [4,8]那么新的intervalsintervals = [[1,2],[3,5],[4,8],[6,7],[8,10],[12,16]]第二步:此时,问题就变成了合并intervals区间与leetcode56. 合并区间 题目相同于是就只需要再调用该题目中的函数返回结果即可官网题目链接:链接题解链原创 2022-05-11 07:21:08 · 239 阅读 · 0 评论 -
Leetcode题库289. 生命游戏(C实现)
文章目录思路效果代码思路思路参考链接:链接链接中使用的是-1,2作为状态标记我的代码中使用的是2,3作为状态标记2:标志着从0 -> 13:标志着从1 -> 0效果代码int counter(int** board, int rows, int columns, int x, int y){ int count=0; int t[]={-1,0,1}; for(int i=0;i<3;i++){ for(int j=0;j<原创 2022-05-10 09:05:26 · 473 阅读 · 0 评论 -
Leetcode题库75. 颜色分类(二路归并 C实现)
文章目录思路代码思路二路归并直接莽 二路归并讲解代码//有序数组调整void Array_Merge(int* head,int low,int high,int* head1,int low1,int high1,int L,int Step_L,int Bool){ int Temp[((high-low)/Step_L+1)+((high1-low1)/Step_L+1)]; int i=0,j=low,k=low1; if(Bool){ whil原创 2022-05-09 08:27:04 · 345 阅读 · 0 评论 -
Leetcode题库442.数组中重复的数据(C实现)
文章目录思路代码思路遍历数组nums,并将每个数组值-1作为下标检索这个数组取得这个值将其加上numsSize出现两次的数,将它作为下标检索出来的值一定>2numsSize所以再遍历一次nums,将数组值大于2numsSize的下标找出来,放到nums数组的前面,插入位置用flag标记,遍历完成后flag就是需要返回数组的长度,最后返回nums即可代码时间复杂度:O(n)空间复杂度:O(1)int* findDuplicates(int* nums, int numsSize, int原创 2022-05-08 07:44:50 · 533 阅读 · 0 评论 -
Leetcode题库148. 排序链表(递归 双指针合并 C实现)
文章目录思路程序框架举例说明代码思路程序框架举例说明4 -> 2 -> 1 -> 3分割:4 -> 2 , 1 -> 3长度判断:4 -> 2长度<=2,直接冒泡返回2 -> 4长度判断:1 -> 3长度<=2,直接冒泡返回1 -> 3合并有序数组的方法(双指针)合并有序链表2 -> 4、1 -> 3得到:1 -> 2 -> 3 -> 4代码cv就完了代码参考 链接struct原创 2022-05-07 08:22:06 · 482 阅读 · 0 评论 -
Leetcode题库96. 不同的二叉搜索树(动规 C实现)
文章目录思路代码思路思路讲得很清楚,有疑问的家人们可以看看 链接代码int numTrees(int n){ int dp[n+1]; dp[0]=1; dp[1]=1; int i,j; for(i=2;i<=n;i++){ dp[i]=0; for(j=0;j<i;j++){ dp[i]+=dp[j]*dp[i-1-j]; } } return dp[n];原创 2022-05-06 06:58:53 · 305 阅读 · 0 评论 -
Leetcode题库713. 乘积小于 K 的子数组(双指针 C实现)
文章目录思路代码思路举例说明:[100,2,3,4,100,5,6,7,100]100第一步搜寻合法开头:也就是找到第一个小于k的数赋予leftleft=1,right=1,current_product=2为什么跳过100呢,因为target=100,满足条件的连续子数组不能包含100第二步搜寻left开头,right结束的满足条件的最大的子数组left=1,right=3,current_product=24子数组为:[2,3,4]第三步计算以2开头的满足条件的子数组[2]、[原创 2022-05-05 09:07:59 · 1108 阅读 · 0 评论 -
Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)
文章目录思路代码递归迭代思路设 n 名小伙伴做游戏,计数为k有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小伙伴此时从k+1开始重新计数n-1名小伙伴时,第一个离开的小伙伴编号为k+1+(k-1)=2k,剩下n-2名小伙伴此时从2k+1开始重新计数……设 n 名小伙伴做游戏,计数为k时,状态转移方程为f(n,k)f(n,k) 与f(n-1,k)状态转移方程代码递归int findTheWinner(int n, int k){ if(n == 1) return原创 2022-05-04 07:33:59 · 716 阅读 · 0 评论 -
Leetcode题库48. 旋转图像(python实现)
文章目录思路代码思路先转置,后水平翻转代码class Solution: def rotate(self, matrix: List[List[int]]) -> None: n = len(matrix) # 转置 for i in range(n): for j in range(i): matrix[i][j], matrix[j][i] = matrix[j][i], mat原创 2022-05-03 06:58:58 · 660 阅读 · 0 评论 -
Leetcode题库54. 螺旋矩阵(C实现)
文章目录思路效果代码思路1、-101标记已走过的路线2、优先级 右 —> 下 —> 左 —> 上3、每变向一次,就一条道走到黑,除非碰壁(越界)或者value = -101效果代码int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){ int len=matrixSize*matrixColSize[0],flag=0,i=0,j=-1; int原创 2022-05-02 08:41:01 · 155 阅读 · 0 评论 -
Leetcode题库74. 搜索二维矩阵(折半查找 C实现)
文章目录思路代码思路与一维数组的折半查找的思路相同,只是中间多了一维坐标与二维坐标之间的转换代码bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) { int low = 0, high = matrixSize * matrixColSize[0] - 1,mid,x; //二分查找 while (low <= high) { mid = (hi原创 2022-05-01 07:32:31 · 155 阅读 · 0 评论 -
Leetcode题库64. 最小路径和(递归 & 动规 C实现)
文章目录思路效果代码动规递归思路递归思路可参考 此处时间复杂度:O(mn)空间复杂度:O(mn)递归超时,谨慎使用动规思路参考 此处时间复杂度:O(mn)空间复杂度:O(m+n)我的思路与题解稍有不同,但大体上是一样的效果动规代码动规int minPathSum(int** grid, int gridSize, int* gridColSize) { if (gridSize == 0 || gridColSize[0] == 0) { return原创 2022-04-30 10:10:11 · 373 阅读 · 0 评论 -
Leetcode题库77. 组合(python实现)
文章目录思路效果代码思路效果测试又抽风了,右下角测试用例和它内部测试结果居然不一样代码ret=[]def func(nums,l,k,array): if len(array)==k: #原写法:ret.append(array) #在主函数中直接返回ret即可,而不是像我那样再次将ret切分 #但是这么写之后,ret并拿不到array数组,可能是局部空间的原因(用完即收) for原创 2022-04-29 08:25:59 · 2394 阅读 · 0 评论 -
Leetcode题库905. 按奇偶排序数组(c实现)
文章目录思路方法1:一次遍历,遇偶存头,遇奇存尾方法2:一次遍历,双指针交换方法1代码思路方法1:一次遍历,遇偶存头,遇奇存尾建立一个与nums数组相同长度的数组ret遍历nums遇到偶数则将其存于头部遇到奇数则将其存于尾部时间复杂度:O(n)空间复杂度:O(n)方法2:一次遍历,双指针交换左指针指向nums中从左至右第一个奇数右指针指向nums中从左至右第一个偶数交换左右指针中的数值经过上述操作,左指针处的数值以及左指针之前的数值都是偶数右指针处的数值以及右指针之后的数值都是原创 2022-04-28 07:04:42 · 229 阅读 · 0 评论 -
Leetcode题库24. 两两交换链表中的节点(c实现)
文章目录思路效果代码思路virtual_head作为临时节点保存交换过的链表的尾部,使得left和right进行交换之后能够连接到原链表的尾部效果代码struct ListNode* swapPairs(struct ListNode* head){ if(head==NULL || head->next==NULL) return head; struct ListNode *left=head,*right=head->next; //第一次交换涉及头节原创 2022-04-27 09:27:45 · 1293 阅读 · 0 评论 -
Leetcode题库61. 旋转链表(c实现)
文章目录思路举例代码思路1、计算链表总长度,并把链表变为循环链表2、计算旋转后链表头节点的前一个节点,将p移至此处3、将p->next保存ret=p->next,再将p->next=null,断开循环链表,返回ret举例输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]1、链表长度为num_node=5,链表变为循环链表,p指向5(原链表的尾部)2、计算旋转后链表头节点的前一个节点的位置num_node - k%num_node=5-2原创 2022-04-26 07:09:07 · 1591 阅读 · 0 评论 -
Leetcode题库34. 在排序数组中查找元素的第一个和最后一个位置(折半查找 c实现)
文章目录思路代码思路1、折半查找(Seekaim),寻找target位置2、范围搜索(Seekrange),确定target边界代码/** * Note: The returned array must be malloced, assume caller calls free(). */int Seekaim(int* nums, int aim, int left, int right) { //在[l,r]搜寻aim的位置,-1:不存在 if(nums[left] &l原创 2022-04-25 07:19:53 · 148 阅读 · 0 评论 -
Leetcode题库46. 全排列(递归 c++实现)
文章目录思路代码思路递归终点:nums长度为0代码代码链接class Solution {public: void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){ // 所有数都填完了 if (first == len) { res.emplace_back(output)原创 2022-04-24 07:21:51 · 527 阅读 · 0 评论 -
Leetcode题库78. 子集(递归 c实现)
文章目录思路代码思路代码代码来源:链接int** ans;int* ansColSize;int ansSize;int* t;int tSize;void dfs(int cur, int* nums, int numsSize) { if (cur == numsSize) { int* tmp = malloc(sizeof(int) * tSize); memcpy(tmp, t, sizeof(int) * tSize);原创 2022-04-23 07:23:52 · 88 阅读 · 0 评论