
每日算法一题
分享每日刷的觉得有意义的力扣算法题,作为学习型总结。
苏米素
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 11. 旋转数组的最小数字 (二分查找 数组中有重复数字,二分查找分三种情况)
剑指 Offer 11. 旋转数组的最小数字本题和 154. 寻找旋转排序数组中的最小值 II 完全相同,是 153. 寻找旋转排序数组中的最小值 的延伸。读者可以先尝试 153 题,体会在旋转数组中进行二分查找的思路,再来尝试解决本题。int minArray(int* numbers, int numbersSize){ if(numbersSize == 1) return numbers[0]; int left = 0; int right = numbers原创 2020-07-22 11:43:54 · 193 阅读 · 0 评论 -
95. 不同的二叉搜索树 II (递归)
95. 不同的二叉搜索树 II/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free(). */stru原创 2020-07-21 17:46:09 · 171 阅读 · 0 评论 -
96. 不同的二叉搜索树 (动态规划)
96. 不同的二叉搜索树给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 3 2/ / \ 2 1 2原创 2020-07-15 15:42:13 · 127 阅读 · 0 评论 -
120. 三角形最小路径和 (C语言+暴力递归+优化递归+动态规划+空间优化动态规划)
120. 三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。/*解法1:递归 (超时)int dfs(int **triangle,int i,int j,int triangleSiz原创 2020-07-14 11:51:01 · 824 阅读 · 0 评论 -
350. 两个数组的交集 II (C语言---暴力题解+哈希数组+排序双指针)
350. 两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。/** * Note: The returned array must be malloced, ass原创 2020-07-13 11:46:20 · 527 阅读 · 0 评论 -
315. 计算右侧小于当前元素的个数 (二分查找+归并排序)
315. 计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入: [5,2,6,1]输出: [2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1).2 的右侧仅有 1 个更小的元素 (1).6 的右侧有 1 个更小的元素 (1).1 的右侧有 0 个更小的元素.** * Note: The returned原创 2020-07-11 22:23:14 · 223 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期 (动态规划)
309. 最佳买卖股票时机含冷冻期给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]今天又是被每日一题绕晕的一天!!!!!!!!!!!!!原创 2020-07-10 22:51:12 · 192 阅读 · 0 评论 -
112. 路径总和 (C语言递归+手写思路笔记)
112. 路径总和给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5-&g原创 2020-07-07 11:26:16 · 519 阅读 · 1 评论 -
63. 不同路径 II (C+动态规划+附上详细手写笔记说明)
63. 不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。原创 2020-07-06 16:25:15 · 676 阅读 · 1 评论 -
32. 最长有效括号 (java--栈--手写思路)
32. 最长有效括号给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”class Solution { public int longestValidParentheses(String s) { int max = 0; Stack<Integer>原创 2020-07-04 17:42:07 · 3518 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树 (递归生成二叉树,左右子树高度相差不超过1)
108. 将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \-3 9/ /-10 5//helper是递归函数struct TreeNode* helper(int* nums,int原创 2020-07-03 10:23:47 · 238 阅读 · 0 评论 -
15. 三数之和 ----- 排序+双指针(与两数之和相似)
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]链接: 画解算法:15. 三数之和.又是这个(*returnSize)++,忘记打括号了!!!!!!!!!!!!!!!!记住原创 2020-06-12 09:49:52 · 160 阅读 · 0 评论 -
739. 每日温度 --- 单调栈 (Java调用栈,C语言手写栈)
739. 每日温度根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。算法思想链接:一看就懂的单调栈链接:原创 2020-06-11 10:56:23 · 247 阅读 · 0 评论 -
9. 回文数 ----反转字符串,反转一半数字
9. 回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。bool isPalindrome(int x){ //方法一:转成字符串,翻转比较是否相等 /*原创 2020-06-10 17:45:41 · 218 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串 ----- 动态规划
面试题46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”解题思路:其实可以想象成走楼梯例题、斐波拉契数列等经典动态规划问题:只不过这个原创 2020-06-09 16:23:10 · 197 阅读 · 0 评论 -
990. 等式方程的可满足性 --- 并查集
990. 等式方程的可满足性(中等)给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。示例 1:输入:[“a==b”,“b!=a”]输出:false解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但原创 2020-06-08 18:31:36 · 206 阅读 · 0 评论 -
面试题29. 顺时针打印矩阵 ----按层模拟
面试题29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]/** * Note: The returned array must be malloced, assume原创 2020-06-05 12:31:04 · 176 阅读 · 0 评论 -
238. 除自身以外数组的乘积 ----左右乘积列表
238. 除自身以外数组的乘积给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对原创 2020-06-04 14:32:59 · 206 阅读 · 0 评论 -
837. 新21点 动态规划---从后往前推
注意dp[K+W]和s一定要初始化为double数据,否则会丢失精度double new21Game(int N, int K, int W){ //注意dp[K+W]和s一定要初始化为double数据,否则会丢失精度 double dp[K+W]; //每个下标值对应的获胜概率 double s = 0; //累加概率 f(x)=1/W *s = s/W; s = ( f(x+1) + f(x+2) +...+ f(x+W) ) for(int i = K;...原创 2020-06-03 16:28:57 · 756 阅读 · 0 评论 -
面试题64. 求1+2+…+n ----递归和&&判断递归出口
面试题64. 求1+2+…+n求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45限制:1 <= n <= 10000此题之妙在于使用了下述代码来控制递归的出口n && (n += sumNums(n-1));/*以逻辑运算符 && 为例,对于 A && B原创 2020-06-02 12:41:24 · 505 阅读 · 0 评论 -
200. 岛屿数量 ---深度优先搜索(DFS)
岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。void DFS(char** grid, int gridSi.原创 2020-05-31 11:16:20 · 202 阅读 · 0 评论 -
199. 二叉树的右视图----深度优先搜索
二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ 2 3 <—\ 5 4 <—/** * Definition for a binary tree node. * struct TreeNode { * int val;.原创 2020-05-30 15:17:45 · 193 阅读 · 0 评论 -
151. 翻转字符串里的单词 (strncat拼接函数,双指针left和right从末尾开始查找单词。)
翻转字符串里的单词给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a good example”输出: “example good a”解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含.原创 2020-05-27 11:28:37 · 184 阅读 · 0 评论 -
46.全排列 --回溯递归
链接: 官方解题思路. 这个错误害我找了好久好久!!长记性啊 (*returnSize)++; //错在没打上小括号!!!!!!!!!!!!!!/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. * Note: Both returned array and *columnSizes.原创 2020-05-16 12:24:33 · 187 阅读 · 0 评论 -
33. 搜索旋转排序数组 二分查找
算法思路:C语言解法://二分查找思想int search(int* nums, int numsSize, int target){ if(numsSize == 0) return -1; if(numsSize == 1) (target == nums[0]) ? 0 : -1; int left = 0,right = numsSize-1; while(left <= right) {//如果left==right,找到了说明结果是l.原创 2020-05-15 10:41:10 · 160 阅读 · 0 评论 -
22. 括号生成 回溯算法-递归树
本次题解思路参考来源如下:作者:dingjinyang链接: link.来源:力扣(LeetCode)/** * Note: The returned array must be malloced, assume caller calls free(). */#define MAX_SIZE 1430void huisu(int left,int right,int n,char *str,int index,char **result,int *returnSize) { i.原创 2020-05-14 12:52:41 · 246 阅读 · 0 评论 -
11. 盛最多水的容器 双指针
做此题的关键在于要想到双指针这个点,否则就只想得到暴力解法了。其次还要设计双指针应该怎么移动问题,证明移动方法确实能够得出答案。链接: 题解官方思路解答.#define MAX(a,b) a>=b ? a:b#define MIN(a,b) a<=b ? a:bint maxArea(int* height, int heightSize){ int max=0; int l = 0,r = heightSize-1; while(l<r) {原创 2020-05-13 14:44:01 · 108 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
解题思路:1.首先跳过空字符;2.判断正负号;3.把数字位转变为整数放入ret;4.判断整数ret是否溢出。(C语言中对于INT_MAX和INT_MIN已经定义了)int myAtoi(char * str){ //跳过开头的空格 while(*str == ' ') ++str; //记录正负号 int flag = 1; if(*str == '-') { flag=-1; ++str; ...原创 2020-05-12 16:14:18 · 128 阅读 · 2 评论 -
面试题62. 圆圈中最后剩下的数字
1.重新理解题目感觉题目对过程的描述不清楚,我们重新来理解题目:n个人站成一圆圈,编号分别为1、2、…、n,从编号1的人开始报数1,2,…报到m时,这个报m的人出列;再从出列人的后一人开始重新报数1,2,…报到m时,再出列;…求队列只剩1人时该人的编号。2.一行代码解决class Solution {public: int lastRemaining(int n, int m) { return n==1 ? n-1 : (lastRemaining(n-1,m).原创 2020-05-11 20:10:23 · 228 阅读 · 0 评论 -
面试题59 - II. 队列的最大值 ---- 复习队列知识(手写队列C语言)
面试题59 - II. 队列的最大值中规中规队列算法,复习了一下数据结构的队列吧。typedef struct { int value; struct Node *next;}Node;typedef struct { Node *head; Node *tail;} MaxQueue;MaxQueue *maxQ = NULL;MaxQueue* maxQueueCreate() { maxQ = (MaxQueue *)malloc(sizeof(M原创 2020-05-10 13:43:09 · 147 阅读 · 0 评论 -
leetcode报错:==45==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x000
今天的力扣一题,题目还行,就死在了下列这个报错中。还是分享一下题解吧,在后方。力扣报错:===================================================================45==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x000000401b4d bp 0x7ffd417069e0 sp 0x7ffd417069d0WRITE of原创 2020-05-09 17:13:03 · 7592 阅读 · 0 评论 -
面试题 17.16. 按摩师 动态规划不用递归
** 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。**官方题解!!!!!!!!!!!!!!!!!!!!!!!!//C语言实现#define MAX(a, b) ( (a > b) ? a : b )...原创 2020-05-07 11:16:08 · 181 阅读 · 0 评论 -
面试题 01.06. 字符串压缩--------计算字符个数,把个数分解成字符存入数组
char* compressString(char* S){ int len=strlen(S); if(len==1||len==2) return S; char *A=(char*)malloc(sizeof(char)*(2*len)); char a; int i,j=0; int k = 0; for(i = 0;i < l...原创 2020-05-04 14:03:17 · 230 阅读 · 0 评论 -
1162. 地图分析 (BFS广度优先搜索算法通俗易懂应用)
//BFS广度优先搜索算法//算法思想:扩充陆地,或者借用甜姨的思想大海盗搜索海洋/*假设你有一个船队,在很多陆地上(1)驻扎,你需要去探索海洋(0),去发掘一个最遥远神秘的海洋(也就是这个海洋区域到离它最近的陆地区域的距离是最大的)。然后你让每个陆地上的分队都各自派出四个方向去探索,各自找到最近的一块海洋后又分4头行动继续探索,那么工作到最后的那一支船队找到的海洋就是所要找的(因...原创 2020-05-03 15:27:02 · 401 阅读 · 0 评论 -
999. 可以被一步捕获的棋子数 (方向数组)
力扣每日阅读理解!!!!!!!!!!!!!!!真的是阅读理解,每次题目要理解半天。其实挺简单的。 (不玩象棋的我一开始有点懵)int numRookCaptures(char** board, int boardSize, int* boardColSize){ int Rx=0,Ry=0; //记录车的位置 int i,j; int ct = 0,step;...原创 2020-04-28 14:25:37 · 166 阅读 · 0 评论 -
994. 腐烂的橘子 (广度探索)
解题思路本题的核心思路是:只考虑1、2右面和下面的如果是0,不管;如果是1,只要右面和下面有2 ,自己就感染为2;如果是2,只要右面和下面是1,将其感染为3(目的是让它在本轮内无法感染别人);如果是3,将其置为2。end作为结束的标志。结束后,再次扫瞄一遍,如果还有未感染的1,就返回-1。作者:Danny_Jay链接:https://leetcode-cn.com/pro...原创 2020-04-26 14:46:27 · 174 阅读 · 0 评论 -
力扣每日一题 914. 卡牌分组
这句话一定要有否则会出错;一定要全部初始化为0.memset(count,0,sizeof(count));gcd算法就是求两个数的最大公约数。这道题的关键是求出(是否有一个元素的个数是所有其他元素个数的最大公约数。int gcd(int x,int y){ if(y==0) return x; return gcd(y,x%y);}bool hasGroupsSize...原创 2020-04-23 15:21:15 · 362 阅读 · 0 评论 -
912. 排序数组 ---(快速排序 超易理解方法)
今日力扣一题复习的是快速排序,很久以前学的都忘了。推荐一个快速容易理解快排的文章–链接: 快速排序./** * Note: The returned array must be malloced, assume caller calls free(). */ void quicksort(int left,int right,int *a) { int i,j,t,tem...原创 2020-04-22 11:05:13 · 157 阅读 · 0 评论 -
力扣每日一题 892. 三维形体的表面积
现搬运一位大神的解题思路,简单清晰:C语言程序代码:#define MIN_TWO(a, b) ( (a < b) ? a : b )int surfaceArea(int** grid, int gridSize, int* gridColSize){ int cube = 0;//记录立方体的个数 int face = 0;//记录重叠...原创 2020-04-21 14:22:58 · 228 阅读 · 0 评论 -
力扣每日一题 --- 836.矩阵重叠
今天题目还是比较简单的,不复杂。#define MAX_TWO(a, b) ( (a > b) ? a : b )#define MIN_TWO(a, b) ( (a < b) ? a : b )bool isRectangleOverlap(int* rec1, int rec1Size, int* rec2, int rec2Size){ if( M...原创 2020-04-19 14:45:05 · 242 阅读 · 0 评论