Leetcode题集
记录
神秘的企鹅
Freshman
展开
-
面试题 02.03. 删除中间节点
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。来源:力扣(LeetCode)237. 删除链表中的节点完全一致/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */void deleteNo..原创 2021-09-16 12:24:31 · 80 阅读 · 0 评论 -
面试题 02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。来源:力扣(LeetCode)暴力遍历第一次遍历记录链表元素个数第二次查找所在位置/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */intkthToLast(struct ListNode* head, int k)..原创 2021-09-17 13:10:05 · 92 阅读 · 0 评论 -
面试题 02.01. 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。来源:力扣(LeetCode)双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeDuplicateNodes(struct ListNode* head){ struct.原创 2021-09-16 12:21:30 · 63 阅读 · 0 评论 -
面试题 01.08. 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。0 1 2 0 3 4 5 2 1 3 1 5 0 0 0 0 0 4 5 0 0 3 1 0 来源:力扣(LeetCode)辅助数组void setZeroes(int** matrix, int matrixSize, int* matrixColSize){// 用 .原创 2021-09-23 11:18:02 · 109 阅读 · 0 评论 -
录面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]提示:0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))来源:力扣(LeetCode)快速排序/** * Note: The returned array must be malloced, assume caller.原创 2021-09-04 20:33:43 · 79 阅读 · 0 评论 -
5872. 连接后等于目标字符串的字符串对
给你一个 数字字符串数组 nums和一个 数字字符串 target,请你返回 nums[i] + nums[j](两个字符串连接)结果等于 target的下标 (i, j)(需满足 i != j)的数目。来源:力扣(LeetCode)class Solution { public int numOfPairs(String[] nums, String target) { int ans = 0; for (int ...原创 2021-10-03 07:09:12 · 125 阅读 · 0 评论 -
5871. 将一维数组转变成二维数组
给你一个下标从 0开始的一维整数数组original和两个整数m和n。你需要使用original中所有元素创建一个m行n列的二维数组。original中下标从 0到 n - 1(都 包含 )的元素构成二维数组的第一行,下标从 n到 2 * n - 1(都 包含)的元素构成二维数组的第二行,依此类推。请你根据上述过程返回一个m x n的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。来源:力扣(LeetCode)模拟...原创 2021-10-03 06:53:59 · 251 阅读 · 0 评论 -
5855. 找出数组中的第 K 大整数
给你一个字符串数组 nums 和一个整数 k 。nums 中的每个字符串都表示一个不含前导零的整数。返回 nums 中表示第 k 大整数的字符串。注意:重复的数字在统计时会视为不同元素考虑。例如,如果 nums 是 ["1","2","2"],那么 "2" 是最大的整数,"2" 是第二大的整数,"1" 是第三大的整数。来源:力扣(LeetCode)快速排序intcmp(const void *a, const void *b){ int alen = strlen (*原创 2021-08-30 01:05:12 · 121 阅读 · 0 评论 -
2016. 增量元素之间的最大差值
给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。来源:力扣(LeetCode)双循环int maximumDifference(int* nums, int numsSize){ int max = 0;原创 2021-09-29 06:08:26 · 164 阅读 · 0 评论 -
1894. 找到需要补充粉笔的学生编号
一个班级里有n个学生,编号为 0到 n - 1。每个学生会依次回答问题,编号为 0的学生先回答,然后是编号为 1的学生,以此类推,直到编号为 n - 1的学生,然后老师会重复这个过程,重新从编号为 0的学生开始回答问题。给你一个长度为 n且下标从 0开始的整数数组chalk和一个整数k。一开始粉笔盒里总共有k支粉笔。当编号为i的学生回答问题时,他会消耗 chalk[i]支粉笔。如果剩余粉笔数量 严格小于chalk[i],那么学生 i需要 补充粉笔。请你返...原创 2021-09-10 17:38:21 · 91 阅读 · 0 评论 -
1588. 所有奇数长度子数组的和
给你一个正整数数组arr,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr中 所有奇数长度子数组的和 。来源:力扣(LeetCode)三循环int sumOddLengthSubarrays(int* arr, int arrSize){ int sum = 0; int i, j, k; for (i = 1; i <= arrSize; i += 2) { ...原创 2021-08-29 00:59:18 · 64 阅读 · 0 评论 -
1480. 一维数组的动态和
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。来源:力扣(LeetCode)/** * Note: The returned array must be malloced, assume caller calls free(). */int* runningSum(int* nums, int numsSize, int* returnSize){ int.原创 2021-08-28 08:27:23 · 69 阅读 · 0 评论 -
1290. 二进制链表转整数
给你一个单链表的引用结点head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。来源:力扣(LeetCode)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */int getDecimalValue(struct Lis.原创 2021-09-16 12:51:51 · 74 阅读 · 0 评论 -
1221. 分割平衡字符串
在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串。返回可以通过分割得到的平衡字符串的 最大数量 。来源:力扣(LeetCode)贪心算法int balancedStringSplit(char * s){ int len = strlen (s); int ans = 0; int count = 0;// count ..原创 2021-09-07 07:52:51 · 89 阅读 · 0 评论 -
1143. 最长公共子序列
给定两个字符串text1 和text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。来源:力扣(LeetCode)动态规划int...原创 2021-09-25 11:36:37 · 70 阅读 · 0 评论 -
1137. 第 N 个泰波那契数
泰波那契序列Tn定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数n,请返回第 n 个泰波那契数Tn 的值。来源:力扣(LeetCode)动态规划int tribonacci(int n){ if (n == 0) { return 0; } else if (n < 3) { ret...原创 2021-09-06 23:30:46 · 122 阅读 · 0 评论 -
977. 有序数组的平方
给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。来源:力扣(LeetCode)快速排序/** * Note: The returned array must be malloced, assume caller calls free(). */intcmp(int *a, int *b){ return *a - *b;}int* sortedSquares(int* nums, int numsSi...原创 2021-08-28 09:02:20 · 61 阅读 · 0 评论 -
881. 救生艇
第i个人的体重为people[i],每艘船可以承载的最大重量为limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。来源:力扣(LeetCode)贪心算法+双指针intcmp (int *a, int *b){ return *a - *b;}int numRescueBoats(int *people, int peopleSize, int limit)...原创 2021-08-26 09:38:35 · 62 阅读 · 0 评论 -
876. 链表的中间结点
给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。来源:力扣(LeetCode)双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* middleNode(struct ListNode* head){..原创 2021-08-31 09:03:10 · 74 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。来源:力扣(LeetCode)动态规划与 70. 爬楼梯类似踏上第i级台阶有两种方法:先踏上第i-1级台阶(最小总花费dp[i - 1]),再迈一步踏上第i级台阶..原创 2021-09-09 21:10:08 · 113 阅读 · 0 评论 -
744. 寻找比目标字母大的最小字母
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母target,请你寻找在这一有序列表里比目标字母大的最小字母。在比较时,字母是依序循环出现的。举个例子:如果目标字母 target = 'z' 并且字符列表为letters = ['a', 'b'],则答案返回'a'来源:力扣(LeetCode)快速排序intcmp (const void *a, const void *b){ return *((char *)a) ...原创 2021-08-30 12:45:39 · 277 阅读 · 0 评论 -
740. 删除并获得点数
给你一个整数数组nums,你可以对它进行一些操作。每次操作中,选择任意一个nums[i],删除它并获得nums[i]的点数。之后,你必须删除 所有 等于nums[i] - 1 和 nums[i] + 1的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。来源:力扣(LeetCode)动态规划由题可知:当你选了一个数 x ,那么 x - 1 和 x + 1, 则不做选择例如 ;nums = [1, 1, 2, 2, 2, 3, 3, 3, 3, ...原创 2021-09-14 22:35:26 · 90 阅读 · 0 评论 -
725. 分隔链表
给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个符合上述规则的链表的列表。来源:力扣(LeetCode)由题可知, 最大部分和其余部分差值为1那应该有多少链表元素为最大长度?由例题元素个数为 10, k的值为3, 链表最长的个...原创 2021-09-22 07:12:35 · 80 阅读 · 0 评论 -
719. 找出第 k 小的距离对
给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。来源:力扣(LeetCode)快速排序 + 二分查找int cmp(int *a, int *b) { return *a - *b;}//计算小于mid的个数int count(int *nums, int numsSize, int mid) { int slow = numsSize - 1, res = 0; int .原创 2021-09-05 09:39:07 · 83 阅读 · 0 评论 -
704. 二分查找
给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。来源:力扣(LeetCode)双指针int search(int* nums, int numsSize, int target){ int left = 0; int right = numsSize - 1; for (; left <= right; left ++, ri...原创 2021-08-27 07:07:30 · 92 阅读 · 0 评论 -
678. 有效的括号字符串
给定一个只包含三种字符的字符串:(,)和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:1.任何左括号 (必须有相应的右括号 )。2.任何右括号 )必须有相应的左括号 (。3.左括号 ( 必须在对应的右括号之前 )。4.*可以被视为单个右括号 ),或单个左括号 (,或一个空字符串。5.一个空字符串也被视为有效字符串。来源:力扣(LeetCode)贪心算法bool checkValidString(char * s){ i...原创 2021-09-12 08:32:28 · 292 阅读 · 0 评论 -
658. 找到 K 个最接近的元素
给定一个排序好的数组arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。整数 a 比整数 b 更接近 x 需要满足:|a - x| < |b - x| 或者|a - x| == |b - x| 且 a < b来源:力扣(LeetCode)双指针/** * Note: The returned array must be malloced, assume caller calls free(...原创 2021-08-29 16:12:31 · 75 阅读 · 0 评论 -
583. 两个字符串的删除操作
给定两个单词word1和word2,找到使得word1和word2相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。提示:给定单词的长度不超过500。来源:力扣(LeetCode)动态规划int minDistance(char * word1, char * word2){ int length1 = strlen (word1); int length2 = strlen (word2); int dp[length1 ...原创 2021-09-25 11:34:21 · 66 阅读 · 0 评论 -
567. 字符串的排列
给你两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。换句话说,s1的排列之一是s2的子串。来源:力扣(LeetCode)滑动窗口bool equals(int *book1, int *book2) { int i; for (i = 0; i < 26; i ++) { if (book1[i] != book2[i]) { retur...原创 2021-09-02 21:35:56 · 60 阅读 · 0 评论 -
561. 数组拆分 I
给定长度为2n的整数数组 nums ,你的任务是将这些数分成n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到n 的 min(ai, bi) 总和最大。返回该 最大总和 。来源:力扣(LeetCode)快速排序intcmp(int *a, int *b){ return *a - *b;}int arrayPairSum(int* nums, int numsSize){ int sum ...原创 2021-09-24 06:52:56 · 74 阅读 · 0 评论 -
557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。来源:力扣(LeetCode)双指针 (原地修改)voidswap(char *a, char *b){ char tmp = *a; *a = *b; *b = tmp;}char * reverseWords(char * s){ int len = strlen (s); int i = 0; while (i < le.原创 2021-08-30 08:48:43 · 58 阅读 · 0 评论 -
528. 按权重随机选择
给定一个正整数数组w ,其中w[i]代表下标 i的权重(下标从 0 开始),请写一个函数pickIndex,它可以随机地获取下标 i,选取下标 i的概率与w[i]成正比。例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3)= 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3)= 0.75(即,75%)。也就是说,选取下标 i 的概率为 w[i] / sum(w) 。来源:力扣(LeetCode)二分查找t...原创 2021-08-30 00:34:41 · 71 阅读 · 0 评论 -
509. 斐波那契数
斐波那契数,通常用F(n) 表示,形成的序列称为 斐波那契数列 。该数列由0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 。来源:力扣(LeetCode)通项公式(数学)我们假设有一个等比数列,公比是x,x不为0,首项为1,可以满足斐波那契数列的递推公式,于是就有:,将等比数列代入递推式中得到,提取,移项,即有:,...原创 2021-09-06 22:54:13 · 263 阅读 · 2 评论 -
498. 对角线遍历
给你一个大小为m x n的矩阵mat,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。示例 1:来源:力扣(LeetCode)模拟我们发现, 当下标和为偶数时, 向右上; 奇数时, 向左下/** * Note: The returned array must be malloced, assume caller calls free(). */int* findDiagonalOrder(int** mat, int matSize, in...原创 2021-09-23 21:43:28 · 127 阅读 · 0 评论 -
485. 最大连续 1 的个数
给定一个二进制数组, 计算其中最大连续 1 的个数。示例:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.来源:力扣(LeetCode)枚举int findMaxConsecutiveOnes(int* nums, int numsSize){ int i; int max = 0; int sum = 0; for (i = 0; i < numsSize; i原创 2021-08-26 08:51:16 · 67 阅读 · 0 评论 -
482. 密钥格式化
有一个密钥字符串 S ,只包含字母,数字以及 '-'(破折号)。其中, N 个 '-' 将字符串分成了 N+1 组。给你一个数字 K,请你重新格式化字符串,使每个分组恰好包含 K 个字符。特别地,第一个分组包含的字符个数必须小于等于 K,但至少要包含 1 个字符。两个分组之间需要用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。来源:力扣(LeetCode)char * licenseKeyFormatti原创 2021-10-04 15:51:41 · 117 阅读 · 0 评论 -
470. 用 Rand7() 实现 Rand10()
已有方法rand7可生成 1 到 7 范围内的均匀随机整数,试写一个方法rand10生成 1 到 10 范围内的均匀随机整数。不要使用系统的Math.random()方法。来源:力扣(LeetCode)拒绝采样 a 1 2 3 4 5 6 7 b 1 2 3 4 5 6 7 8 2 ...原创 2021-09-05 08:40:15 · 51 阅读 · 0 评论 -
410. 分割数组的最大值
给定一个非负整数数组nums和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。来源:力扣(LeetCode)二分查找int splitArray(int* nums, int numsSize, int m){// long long 防止溢出 long long int left = 0, right = 0; int i; for (i = 0; i < numsS...原创 2021-09-05 16:43:10 · 63 阅读 · 0 评论 -
392. 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。进阶:如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?来源:力扣(LeetCode)双指针bool isSubsequence(char.原创 2021-09-10 17:48:24 · 79 阅读 · 0 评论 -
389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。字符串t由字符串s随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。来源:力扣(LeetCode)位运算char findTheDifference(char * s, char * t){ int slen = strlen (s); int tlen = strlen (t); int ret = 0;// 位相同为 0 for (int i = 0;...原创 2021-09-29 13:19:22 · 60 阅读 · 0 评论