
Leetcode刷题笔记(C语言描述)
本专栏是刷题笔记
碰碰狗
计算机专业在读学生
展开
-
705. 设计哈希集合
#define HASH_SIZE 10009typedef enum { Legitimate, Empty, Deleted } Entry_type;struct hash_entry{ int val; Entry_type info;};typedef struct { int size; struct hash_entry* cells;} MyHashSet;int hash_function(MyHashSet* obj, int key){ retur.原创 2022-03-10 20:46:35 · 199 阅读 · 0 评论 -
27. 移除元素
void swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp;}int removeElement(int* nums, int numsSize, int val){ if (numsSize == 1) { if (nums[0] == val) { return 0; } else { return 1; } } for (int i = 0; i < numsSize -.原创 2022-03-02 21:00:49 · 120 阅读 · 0 评论 -
283. 移动零
void swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp;}void moveZeroes(int* nums, int numsSize){ if (numsSize == 1) { return; } for (int i = 0; i < numsSize - 1; i++) { if (nums[i] == 0) { int j; for (j = i + 1; j <.原创 2022-03-02 20:33:20 · 132 阅读 · 0 评论 -
215. 数组中的第K个最大元素
#define MAX_DATE 10000typedef struct heap_type* Heap;struct heap_type{ int capacity; int size; int* elements;};Heap create(int max_size){ Heap h = malloc(sizeof(struct heap_type)); h->elements = malloc((max_size + 1) * sizeof(int)); h.原创 2022-02-27 17:39:14 · 132 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
#define MIN_DATE -1typedef struct heap_type* Heap;struct heap_type{ int capacity; int size; int* elements;};Heap create(int max_size){ Heap h = malloc(sizeof(struct heap_type)); h->elements = malloc(sizeof(int) * (max_size + 1)); h->.原创 2022-02-27 17:21:43 · 160 阅读 · 0 评论 -
707. 设计链表
struct node{ int val; struct node* next;};typedef struct { struct node* first;} MyLinkedList;MyLinkedList* myLinkedListCreate(){ MyLinkedList* obj = malloc(sizeof(MyLinkedList)); obj->first = NULL; return obj;}int myLinkedListGet(MyLin.原创 2022-02-05 15:55:30 · 84 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
struct TreeNode* create(){ struct TreeNode* t = malloc(sizeof(struct TreeNode)); t = NULL; return t;}struct TreeNode* insert(int* nums, int left, int right){ int mid = (left + right) / 2; struct TreeNode* new_node = malloc(sizeof(struct TreeNode.原创 2022-01-27 16:15:02 · 393 阅读 · 0 评论 -
110. 平衡二叉树
int node_height(struct TreeNode* root, bool* balance){ if (root == NULL) { return -1; } int left_height = node_height(root->left, balance); int right_height = node_height(root->right, balance); if (left_height - right_height > 1 || rig.原创 2022-01-27 15:12:36 · 263 阅读 · 0 评论 -
150. 逆波兰表达式求值
typedef int Item;typedef struct stack_type* Stack;struct node { Item val; struct node* next;};struct stack_type { struct node* top;};static void terminate(const char* message){ printf("%s\n", message); exit(EX.原创 2022-01-26 09:37:11 · 105 阅读 · 0 评论 -
739. 每日温度
typedef int Item;typedef struct stack_type* Stack;struct node { Item val; struct node* next;};struct stack_type { struct node* top;};static void terminate(const char* message){ printf("%s\n", message); exit(EX.原创 2022-01-25 18:31:13 · 138 阅读 · 0 评论 -
20. 有效的括号
typedef char Item;typedef struct stack_type* Stack;struct node { Item val; struct node* next;};struct stack_type { struct node* top;};static void terminate(const char* message){ printf("%s\n", message); exit(EX.原创 2022-01-25 16:36:01 · 70 阅读 · 0 评论 -
155. 最小栈
struct node{ int val; struct node* next;};typedef struct { struct node* top; struct node* min_stack_top;} MinStack;MinStack* minStackCreate(){ MinStack* obj = malloc(sizeof(MinStack)); obj->top = obj->min_stack_top = NULL; return obj;.原创 2022-01-25 15:22:54 · 150 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点
struct TreeNode* find_max(struct TreeNode* root){ if (root == NULL) { return NULL; } if (root->right != NULL) { return find_max(root->right); } else { return root; }}struct TreeNode* deleteNode(struct TreeNode* root, int key){ .原创 2022-01-24 10:56:59 · 375 阅读 · 0 评论 -
701. 二叉搜索树中的插入操作
struct TreeNode* insertIntoBST(struct TreeNode* root, int val) { if (root==NULL) { root = malloc(sizeof(struct TreeNode)); root->val = val; root->left = root->right = NULL; } if (val<root->val) { root->left = insertIntoBST.原创 2022-01-24 10:24:34 · 152 阅读 · 0 评论 -
700. 二叉搜索树中的搜索
//递归struct TreeNode* searchBST(struct TreeNode* root, int val){ if (root == NULL) { return NULL; } if (val < root->val) { return find(root->left, val); } else if (val > root->right) { return find(root->right, val); } e.原创 2022-01-24 10:13:59 · 133 阅读 · 0 评论 -
98. 验证二叉搜索树
void inorder(struct TreeNode* root, int* a, int* i){ if (root == NULL) { return; } if (root != NULL) { inorder(root->left, a, i); a[*i] = root->val; *i += 1; inorder(root->right, a, i); }}bool isValidBST(struct TreeNode* root).原创 2022-01-24 09:55:57 · 3889 阅读 · 0 评论 -
112. 路径总和
bool check(struct TreeNode* root, int targetSum, int sum){ if (root == NULL) { return false; } sum += root->val; if (root->left == NULL && root->right == NULL) { if (sum == targetSum) { return true; } else { retu.原创 2022-01-22 18:57:42 · 240 阅读 · 0 评论 -
101. 对称二叉树
bool is_same(struct TreeNode* root1, struct TreeNode* root2){ if (root1 == NULL && root2 == NULL) { return true; } else if (root1 != NULL && root2 != NULL) { if (root1->val != root2->val) { return false; } else {.原创 2022-01-22 16:55:34 · 287 阅读 · 0 评论 -
104. 二叉树的最大深度
int depth(struct TreeNode* root, int dep){ int left_dep, right_dep; if (root == NULL) { return dep; } if (root != NULL) { dep++; left_dep = depth(root->left, dep); right_dep = depth(root->right, dep); } return left_dep > right_.原创 2022-01-22 16:07:21 · 289 阅读 · 0 评论 -
145. 二叉树的后序遍历
void postorder(struct TreeNode* root, int* returnSize, int* a){ if (root == NULL) { return; } if (root != NULL) { postorder(root->left, returnSize, a); postorder(root->right, returnSize, a); a[*returnSize] = root->val; (*returnSi.原创 2022-01-21 15:22:20 · 69 阅读 · 0 评论 -
144. 二叉树的前序遍历
void preorder(struct TreeNode* root, int* returnSize, int* a){ if (root == NULL) { return; } if (root != NULL) { a[*returnSize] = root->val; (*returnSize)++; preorder(root->left, returnSize, a); preorder(root->right, returnSize, .原创 2022-01-21 15:20:12 · 69 阅读 · 0 评论 -
232. 用栈实现队列
//栈typedef struct stack_type* Stack;struct node{ int val; struct node* next;};struct stack_type{ struct node* first;};//Myqueuetypedef struct { struct stack_type* s1; struct stack_type* s2;} MyQueue;//栈的操作bool is_empty(Stack s){ if (.原创 2022-01-18 09:32:36 · 292 阅读 · 0 评论 -
33. 搜索旋转排序数组
int search(int* nums, int numsSize, int target) { if (numsSize == 1) { if (nums[0] == target) { return 0; } else { return -1; } } int i, j, n; int* a = malloc(numsSize * sizeof(int)); for (i = 1; i < numsSize; i++) { if (nu.原创 2022-01-17 13:01:39 · 255 阅读 · 0 评论 -
374. 猜数字大小
int guessNumber(int n){ int low=1,high=n,mid; while(low<=high) { mid=low+(high-low)/2; if(guess(mid)==-1) { high=mid-1; }else if (guess(mid)==1) { low=mid+1; }else .原创 2022-01-17 11:53:51 · 149 阅读 · 0 评论 -
704. 二分查找
int search(int* nums, int numsSize, int target){ int low=0,high=numsSize-1; while(low<=high) { int mid=low+(high-low)/2; if(nums[mid]>target) { high=mid-1; }else if (nums[mid]<target) .原创 2022-01-17 11:12:49 · 264 阅读 · 0 评论 -
225. 用队列实现栈
#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedef struct queue_type* Queue;struct node{ int val; struct node* next;};struct queue_type{ struct node* first; struct node* last;};//MyStacktypedef struct{ stru.原创 2022-01-13 11:00:57 · 106 阅读 · 0 评论 -
94. 二叉树的中序遍历
void in_oreder(struct TreeNode* root, int* res, int* returnSize){ if (root==NULL) { return; } if (root!=NULL) { in_oreder(root->left, res, returnSize); res[*returnSize] = root->val; (*returnSize)++; in_oreder(root->right, res, ret.原创 2021-11-19 15:22:26 · 492 阅读 · 0 评论 -
876. 链表的中间结点
{ //快慢指针法:开始时快,慢指针都指向第一个元素,快指针一次走两步,慢指针一次走一步。 //当快指针指向未结点时,慢指针恰好指向中间结点 struct ListNode* slow = head; struct ListNode* fast = head; while (fast!=NULL&&fast->next!=NULL) { slow = slow->next; fast = fast->next->next; } return .原创 2021-11-16 08:36:10 · 321 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
int missingNumber(int* nums, int numsSize){ //首先判断数组首元素或末元素是否缺失 if (nums[0]!=0) { return 0; } if (nums[numsSize-1]!=numsSize) { return numsSize; } //如果首,末元素都不缺失,就用二分查找去数组中寻找 int left = 0; int right = numsSize - 1; int mid; while (left<.原创 2021-11-14 14:50:37 · 232 阅读 · 0 评论 -
203. 移除链表元素
struct ListNode* removeElements(struct ListNode* head, int val) { //首先,判断链表是否为空,若为空直接返回 if (head==NULL) { return head; } //其次,判断第一个结点是否需要删除,如果需要删除,则把head指针移动到下一个结点,不断循环,直到第一个结点不需要删除为止 while (head->val==val) { //这里需要判断一下该结点是否为最后一个元素,如果是最后一个.原创 2021-11-12 11:38:23 · 256 阅读 · 0 评论 -
414. 第三大的数
int thirdMax(int* nums, int numsSize) { //首先将元素从大到小排序 for (int i = 0; i < numsSize; i++) { for (int j = i; j >0 && nums[j-1]<nums[j]; j--) { int temp = nums[j-1]; nums[j - 1] = nums[j]; nums[j] = temp; } } //其次寻找第三大的.原创 2021-11-10 21:07:14 · 235 阅读 · 0 评论 -
268. 丢失的数字
int missingNumber(int* nums, int numsSize){ //首先,将元素从小到大排序 for (int i = 0; i < numsSize; i++) { for (int j = i; j > 0 && nums[j - 1] > nums[j]; j--) { int temp = nums[j - 1]; nums[j - 1] = nums[j]; nums[j] = temp; } }.原创 2021-11-04 21:41:28 · 89 阅读 · 0 评论 -
217. 存在重复元素
bool containsDuplicate(int* nums, int numsSize) { //首先,将元素从小到大依次排序 for (int i = 0; i < numsSize; i++) { for (int j = i; j > 0 && nums[j - 1] > nums[j]; j--) { int temp = nums[j - 1]; nums[j - 1] = nums[j]; nums[j] = temp;.原创 2021-11-04 20:48:16 · 80 阅读 · 0 评论 -
169. 多数元素
//首先将元素从小到大排列,因为多数元素存在,则numsSize/2一定为多数元素int majorityElement(int* nums, int numsSize) { for (int i = 0; i < numsSize; i++) { for (int j = i; j >0&&nums[j-1]>nums[j]; j--) { int temp = nums[j - 1]; nums[j - 1] = nums[j]; n.原创 2021-11-04 20:24:06 · 94 阅读 · 0 评论 -
88. 合并两个有序数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ //首先排除特殊情况:nums2为空的情况(即n==0) if (n == 0) { return; } //其次将nums2合并到nums1中去 for (int i = m, j = 0; i < m + n && j < n; i++, j++) { nums1[i] = nums2[j].原创 2021-11-04 19:46:48 · 94 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
struct ListNode* getKthFromEnd(struct ListNode* head, int k) { int n = 1; struct ListNode* cnt = head; while (cnt->next!=NULL) { cnt = cnt->next; n++; } int i = n - k; struct ListNode* list = head; while (i>0 && list->nex.原创 2021-11-01 22:17:35 · 98 阅读 · 0 评论 -
69. Sqrt(x)
int mySqrt(int x) { if (x==0) { return 0; } if (x==1) { return 1; } int low = 1; int high = x / 2; while (low<=high) { int mid = (low + high) / 2; if (x/mid==mid) { return mid; } else if (x/mid>mid) { low = mid + 1.原创 2021-11-01 21:26:20 · 102 阅读 · 0 评论 -
35. 搜索插入位置
int searchInsert(int* nums, int numsSize, int target){ int low = 0; int high = numsSize - 1; while (low<=high) { int mid = (low + high) / 2; if (nums[mid]==target) { return mid; } else if (nums[mid]>target) { high = mid - 1;.原创 2021-11-01 20:45:29 · 71 阅读 · 0 评论 -
2. 两数相加
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode* l3 = NULL; struct ListNode* curr =.原创 2021-10-31 22:15:25 · 90 阅读 · 0 评论 -
83. 删除排序链表中的重复元素
//生成一个链表struct ListNode { int val; struct ListNode* next;};struct ListNode* head = NULL;//方法一:遍历链表struct ListNode* deleteDuplicates(struct ListNode* head){ int a[201] = { false }; struct ListNode* prev = NULL; struct ListNode* curr = head; .原创 2021-10-30 15:49:04 · 87 阅读 · 0 评论