Leetcode
[略略略]
小白还需努力
展开
-
C++中常用的STL容器及使用方法整理(更新中)
【代码】C++中常用的STL容器及使用方法整理。原创 2023-03-23 02:50:22 · 250 阅读 · 0 评论 -
二叉树,二叉搜索树相关模板
与二叉树,二叉搜索树相关模板原创 2023-03-09 17:49:29 · 590 阅读 · 0 评论 -
数组、链表常用思路即模板:快排,二分查找,双指针法||C语言
.原创 2023-03-06 11:42:56 · 88 阅读 · 0 评论 -
Leetcode第46题全排列|C语言
void dfs(int top,int numsSize,int** result,int*returnSize,int*temp,int** returnColumnSizes,int startIndex,int* nums){ if(top==numsSize){//本轮收集的数组内元素数量达标,则收割结果 result[*returnSize]=malloc(sizeof(int)*top); for(int i=0;i<top;i++){原创 2023-02-26 15:09:53 · 181 阅读 · 0 评论 -
Leetcode第九十三题复原IP地址|C语言
参考代码随想录代码int isValue(char* s,int left,int right){ if(left>right) return 0; if(s[left]=='0'&&left!=right) return 0; int sum=0; for(int i=left;i<=right;i++){ if(s[i]<'0'||s[i]>'9') retu原创 2023-02-26 10:01:01 · 127 阅读 · 0 评论 -
LeetCode第131题分割回文串|C语言(待更新)
一道题迷迷糊糊做了一天,等理清楚了再更新…bool isHuiWen(char* s){ int length=strlen(s); for(int i=0;i<length/2;i++) if(s[i]!=s[length-1-i]) return false; return true; }char* cut(char* s,int left,int right){ int length=0; char*原创 2023-02-26 02:45:59 · 83 阅读 · 0 评论 -
Leetcode第三十九题组合总和|C语言,效率还行
void backtracking(int *sum,int **returnColumnSizes,int target,int **result,int *returnSize,int *length,int* temp,int index,int *candidates,int candidatesSize){//sum用于每轮保存当轮数字组合的和,result是最终主函数要返回的指针数组,每个指针指向一个符合要求的数字组合//temp用于每轮保存当轮数字组合,length是temp中数字的数量,原创 2023-02-25 14:52:11 · 83 阅读 · 0 评论 -
Leetcode第四十题组合总和2|C语言
void QuickSort(int *candidates,int left,int right){//快排排序,之后在回溯中便于排除相同的数字 if(left>right) return; int i=left; int j=right; int key=candidates[i]; int temp; while(i<j){ while(candidates[j]>=key&&原创 2023-02-25 14:37:24 · 117 阅读 · 0 评论 -
Leetcode第17题电话号码的数字组合|C语言
跟着大佬的答案敲了一下,懵懵懂懂,待更新char *letterMap[]={"0","0","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};void backTrack(char* digits,int *returnSize,char **returnStr,int index,char *stack,int top){ int len=strlen(digits); if(len<=top){ retur原创 2023-02-24 17:47:14 · 299 阅读 · 0 评论 -
Leetcode第216题组合总和3|C语言
题目:找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:1.只使用数字1到92.每个数字 最多使用一次3.返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。代码:void dfs(int left,int right,int k,int n,int **ans,int *returnSize,int *temp,int *temp_index){//left和1right为左右指针,即数字的范围1-9,n和k为题目给定的参数//ans为最终要返原创 2023-02-24 15:30:26 · 141 阅读 · 0 评论 -
Leetcode第77题组合|C语言
题目:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。void dfs(int cur,int n,int k,int *temp_index,int *returnSize,int **ans,int *temp){//cur是每轮遍历要加入的数字,n和k为题目要求的从1-n里挑k个数字//temp是存放每次遍历挑k个数字时的数组,ans是存放数组的数组//returnSize是数组的数组的下标,temp_index是temp数组的原创 2023-02-24 15:35:45 · 193 阅读 · 0 评论 -
Leetcode第538题把二叉搜索树转换为累加树|C语言
题目:给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。大致思路:这道题的题意就是,执行过后,本结点的值,等于把原来所有大于本结点值的结点的值相加起来的和。由于二叉搜索树的中序遍历是有序且非减的,因为题目写明原创 2023-02-23 16:07:23 · 138 阅读 · 0 评论 -
Leetcode第108题将有序数组转换为二叉搜索树|C语言
题目:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。思路:由于数组已经排序好,我们可以直接递归建树,只要每次递归都将当前递归范围中间的数字作为根节点,根节点左右两边的范围各作为左右子树,就可以实现平衡且满足二叉搜索树的性质(即左结点的值<根节点的值<右节点的值)struct TreeNode* build(int *nums,int left,i原创 2023-02-23 16:13:15 · 104 阅读 · 0 评论 -
Leetcode第669题修剪二叉搜索树|C语言
题目:给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。![举例](https://img-blog.csdnimg.cn/339ec440282545868f894823dab4494原创 2023-02-23 16:23:21 · 177 阅读 · 0 评论 -
Leetcode第450题删除二叉搜索树中的结点|C语言
题目:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:1.首先找到需要删除的节点;2.如果找到了,删除它。大致思路:先用pre和T遍历分别找到要删除的结点的父结点和要删除的结点,遍历之后可分为以下几种情况:1.要删除的结点是根节点2.要删除的几点不是根节点2.1要删除的结点是pre的右子树2.1.1要删除的结点的右子树非空2.1.2要原创 2023-02-23 16:48:15 · 445 阅读 · 0 评论 -
Leetcode第701题二叉搜索树中的插入操作|C语言
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){ struct TreeNode* head; struct TreeNode* pre; if(root!=NULL){//根节点非空 head=root;//用head暂存根结点的位置 while(root!=NULL){ //遍历寻找该结点应该在的位置root和父结点位置pre if原创 2023-02-23 16:56:02 · 64 阅读 · 0 评论 -
Leetcode第236题二叉树的最近公共祖先|C语言
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) { if(root->val>p->val&&root->val<q->val) return root; //若p结点的值<q结点的值,而根节点的值位于两者之间,说明是最近公共祖先 else if(ro原创 2023-02-23 17:01:05 · 96 阅读 · 0 评论 -
Leetcode第235题二叉搜索树的最近公共祖先|C语言
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) { if(root->val>p->val&&root->val<q->val) return root; //若p结点的值<q结点的值,而根节点的值位于两者之间,说明是最近公共祖先 else if(ro原创 2023-02-23 17:07:36 · 163 阅读 · 0 评论 -
Leetcode第501题二叉搜索树中的众数|C语言
大致思路:采用双指针,对树进行中序遍历,当前后指针指向的结点的值相等时,临时频率(temp_freq)自增。当临时频率等于目前的最大频率(freq)时,说明该值也为众数,加入众数数组;当临时频率超过目前的最大频率时,临时频率成为最大频率,更新最大频率的值(*freq=temp_freq),并清空众数数组,令数组的指针returnSize指向0就好啦,并将该最大频率对应的值作为第一个众数加入数组。void Find_many(struct TreeNode* root,struct TreeNode** p原创 2023-02-23 18:02:56 · 61 阅读 · 0 评论 -
Leetcode第530题二叉搜索树的最小绝对差|C语言
刚开始看到这道题,习惯性的找了搜索树的最左下和最右下的结点进行计算。结果发现要求返回的是“任意两个结点”的差的绝对值中最小的值。思路:看了答案,因为二叉搜索树的中序遍历是有序数组,因此可以采用中序遍历对相邻结点之间进行两两计算,返回其中的最小值。void Find_min(struct TreeNode *root,int *pre,int *min){ if(root==NULL) return; Find_min(root->left,pre,min);原创 2023-02-22 16:07:29 · 164 阅读 · 0 评论 -
Leetcode第98题验证二叉搜索树|C语言
大致思路:二叉搜索树,需满足:右子树的最大值>根节点的值>左子树的最大值,因此我们从上往下遍历。初始化时将最大值赋值为库里规定的最大值LONG_MAX,最小值赋值为库里规定的最小值LONG_MIN,并传入递归函数。从根节点开始,每次递归遍历左子树时,用现递归层次的根节点的值作为最大值传入递归函数;每次递归遍历右子树时,用现递归层次的根节点的值作为最小值传入递归函数。因为return的值采用&&,因此所有结点中只要有一个不满足条件,即返回false,那么返回到最上层的根节点时一原创 2023-02-22 11:34:48 · 103 阅读 · 0 评论 -
Leetcode第700题二叉搜索树中的搜索|C语言
struct TreeNode* searchBST(struct TreeNode* root, int val){ if(root==NULL) return NULL;//该递归层次的根节点为空,则返回NULL if(root->val==val) return root;//若目标值跟该递归层次的值相等,则直接返回该结点 else if(root->val>val) return searchBST(root-原创 2023-02-22 10:10:40 · 46 阅读 · 0 评论 -
LeetCode第617题合并二叉树|C语言
struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2){ if(root1==NULL&&root2==NULL)//如果两个结点全空,则什么都不用做,返回 return NULL; else if(root1==NULL||root2==NULL){//如果有一个结点为空,合并到子树1 if(root1==NULL)//若结点1为空,说明结点2非空原创 2023-02-22 09:57:41 · 81 阅读 · 0 评论 -
Leetcode第654题最大二叉树|C语言
这道题刚开始没看举例,还以为让我们构建一个大顶堆。后面才发现,题目的意思是:每次遍历数组范围中的最大值,将其作为根节点,然后将该数组最大值的左边区域作为左子树,右边的区域作为右子树,依次进行上述遍历。因为对左右子树横向的大小没有要求排序,所以不能在刚开始就对整个数组进行排序,否则会打乱横向子树的顺序。struct TreeNode* buildTree(int *nums,int left,int right){ //如果数组的左指针大于右指针,说明该区域为空,无需遍历 if(left&原创 2023-02-22 09:42:24 · 55 阅读 · 0 评论 -
Leetcode第513题找树左下角的值||C语言
思路:通过队列对树进行层序遍历,每层记录该层的第一个结点,最后一层的第一个结点的值则是该树左下角的值int findBottomLeftValue(struct TreeNode* root){ struct TreeNode *Nodes[10001]; struct TreeNode *temp; int right=0;//队列的右指针,指向最后一个元素的下一个位置 int left=0;//队列的左指针 int last=1;//记录每层的第一个结点,初始化原创 2023-02-18 11:04:54 · 64 阅读 · 0 评论 -
Leetcode第404题左叶子之和||C语言
bool IsLeafNode(struct TreeNode *root){//用于判断是否是叶子结点 if(root!=NULL&&root->right==NULL&&root->left==NULL) //结点非空且左右子树为空,则为叶子结点 return true; else return false;}int sum(struct TreeNode *root){//用于计算左叶子之和,也可以不用单独写这原创 2023-02-18 11:11:43 · 95 阅读 · 0 评论 -
Leetcode第257题二叉树的所有路径||C语言(待更新)
void creatPath(struct TreeNode*root,char **path,int *nodes,int *returnSize,int top){ if(root!=NULL){ if(root->left==NULL&&root->right==NULL){ char *nodes_path=malloc(101*sizeof(char)); int len=0;原创 2023-02-18 11:11:59 · 57 阅读 · 0 评论 -
Leetcode第110题平衡二叉树||C语言
int Maxhigh(struct TreeNode *root){//计算树高 if(root==NULL) return 0; else{ int left=Maxhigh(root->left)+1; int right=Maxhigh(root->right)+1; return left>right?left:right; }}bool isBalanced(struct TreeNo原创 2023-02-23 18:03:00 · 60 阅读 · 0 评论 -
Leetcode第222题完全二叉树的结点个数||C语言
递归法:int countNodes(struct TreeNode* root){ if(root==NULL) return 0; else{ int left=countNodes(root->left); int right=countNodes(root->right); return left+right+1;//左子树结点数+右子树结点数+本结点(也就是根节点)的数,再返回 }}迭代法原创 2023-02-23 18:07:54 · 78 阅读 · 0 评论 -
Leetcode二叉树的最小深度||C语言
方法一:迭代法int minDepth(struct TreeNode* root){ if(root==NULL)return 0; struct TreeNode *Nodes[10000];//队列 struct TreeNode *node=root; int depth=1; int left=0;//左指针 int right=0;//右指针 Nodes[right++]=root;//right指向最后一个元素的下一个位置原创 2023-02-24 15:39:17 · 48 阅读 · 0 评论 -
Leetcode第104题二叉树的最大深度||C语言
int Depth(struct TreeNode*root){ if(root==NULL)return 0; else{ int left=Depth(root->left)+1; int right=Depth(root->right)+1; return left>right?left:right;//返回左右子树中最高的高度 }}int maxDepth(struct TreeNode* root){原创 2023-02-24 16:15:40 · 69 阅读 · 0 评论 -
Leetcode第101题对称二叉树||C语言
bool IsTrue(struct TreeNode *left,struct TreeNode *right){ if(right==NULL&&left==NULL)return true;//如果左右子树都为空,则对称 else if(right==NULL||left==NULL)return false;//如果只有一个子树为空,这不对称 else{ if(right->val==left->val){原创 2023-02-18 00:53:36 · 54 阅读 · 0 评论 -
Leetcode第226题翻转二叉树||C语言
方法一:递归法struct TreeNode* invertTree(struct TreeNode* root){ if(root==NULL) return NULL; else{ struct TreeNode *temp; invertTree(root->left); invertTree(root->right); temp=root->right; root->right原创 2023-02-18 00:51:48 · 61 阅读 · 0 评论 -
Leetcode第94题二叉树的中序遍历||C语言
方法一:递归法void in(struct TreeNode* root, int *num,int* returnSize){ if(root==NULL)return; else{ in(root->left,num,returnSize); num[(*returnSize)++]=root->val; in(root->right,num,returnSize); }}int* inorderTrave原创 2023-02-18 00:47:43 · 86 阅读 · 0 评论 -
Leetcode第145题二叉树的后序遍历||C语言
方法一:递归法void post(struct TreeNode *root,int *num,int *returnSize){ if(root==NULL)return; else{ post(root->left,num,returnSize); post(root->right,num,returnSize); num[(*returnSize)++]=root->val; }}int* postord原创 2023-02-18 00:48:27 · 67 阅读 · 0 评论 -
Leetcode第144题二叉树的前序遍历||C语言
方法一:递归法:void prior(struct TreeNode*root,int *num,int *returnSize){ if(root==NULL) return; else{ num[(*returnSize)++]=root->val; prior(root->left,num,returnSize); prior(root->right,num,returnSize); } }原创 2023-02-18 00:47:59 · 77 阅读 · 0 评论 -
Leetcode第347题前k个高频元素||C语言(待更新)
struct HashNode{ int val; int index; UT_hash_handle hh;};int cmp(struct HashNode*a,struct HashNode*b){ return b->index-a->index;}/** * Note: The returned array must be malloced, assume caller calls free(). */int* topKFrequent(原创 2023-02-18 00:45:33 · 124 阅读 · 0 评论 -
Leetcode第239题滑动窗口最大值(尽可能易懂)||C语言
首先,我先解释一下候选的最大值的结点的队列是怎么一回事。如果数组nums中的元素为223211,窗口为3,那么初始窗口框住的元素为2、2、3,此时3为最大值。那我们如何对这个候选的最大值的结点的队列进行初始化呢?我们可以把2、2、3依次入队,并规定一条规则:如果新入队的值比原先队列中队尾的值都大,则将这些值弹出后再入队。那为什么要定义这条原则呢?这是因为在初始化的时候,如果新入队的值比原先所有值都大,那这个新入队的值就是暂时的最大值,前面的值已经不再有候补意义。就像这里的2、2、3,等到3入队,那么窗原创 2023-02-18 00:35:51 · 140 阅读 · 0 评论 -
Leetcode第20题有效的括号||C语言
这题其实可以直接在主函数中声明一个大小为10000的char类型的数组,在声明一个i作为栈顶指针就可以解决,但我想练习一下栈的几个主要函数,所以还是打了出来#define Maxsize 10000typedef struct{ char data[Maxsize]; int top;}Stack;Stack* initStack(){//初始化函数 Stack *s=(Stack *)malloc(sizeof(Stack)); s->top=0;//栈原创 2023-02-17 23:51:59 · 94 阅读 · 0 评论 -
Leetcode第225题用队列实现栈||C语言
#define MaxSize 10typedef struct { int data[MaxSize]; int prior;//尾指针 int last;//头指针} MyStack;MyStack* myStackCreate() { MyStack *ms=(MyStack *)malloc(sizeof(MyStack)); ms->prior=0; ms->last=0; return ms;}//我们将队列的头指原创 2023-02-14 11:36:31 · 77 阅读 · 0 评论