
力扣刷题
这个春节 一起刷剑指offer
lalalzo
Acmer 加油
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 Offer 38. 字符串的排列(有重复元素的排列)
思路:dfs 暴搜 class Solution { public: vector<string> permutation(string s) { vector<string> a; function<bool(char,int,int)> check=[&](char x,int st,int idx){ if(st>idx) return false; fo...原创 2022-02-21 20:47:43 · 161 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数(数位dp)
思路:就是数位dp,dp[idx][sum][limit]代表,到idx位,前面有sum个0,有没有limit限制; class Solution { public: int dp[20][50][2]; int len; int pos[20]; int countDigitOne(int n) { for(int i=0;i<15;i++)for(int k=0;k<50;k++) for(int j=0;j<=1;j++)dp..原创 2022-02-21 16:55:15 · 219 阅读 · 0 评论 -
123. 买卖股票的最3佳时机 III
思路:动态规划, dp1是当前第一次买入的最大值 dp2是当前第一次卖出的最大值 dp3是当前第二次买入的最大值 dp4是当前第二次卖出的最大值 转移看代码: class Solution { public: int maxProfit(vector<int>& prices) { int dp1=-0x3f3f3f3f,dp2=-0x3f3f3f3f,dp3=-0x3f3f3f3f,dp4=0; for(int v:prices..原创 2022-02-20 21:53:34 · 151 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路:有两种思路,第一种是先全部正向存储,最后再翻转 第二种思路是使用双端队列bfs,记录顺时针还是逆时针就行。 代码是思路一: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}..原创 2022-02-20 00:59:02 · 209 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
思路:模拟就完事 class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int> c; int idx=0; for(int v:pushed){ c.push(v); while(c.size(..原创 2022-02-20 00:20:04 · 340 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
思路:快速幂模板,主要要注意负数的范围,乘以负一的时候会溢出,所以开一下longlong class Solution { public: double myPow(double x, int n) { if(n==0) return 1; double ans=1.0; int f=1; long long b; if(n<0){ b=(long long)n*(-1); ...原创 2022-02-20 00:02:48 · 260 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).)。 思路:直接算二进制位(简单题) class Solution { public: int hammingWeight(uint32_t n) { int sum=0; while(n){ sum+=n%2; n/=2; } return sum; .原创 2022-02-19 23:18:02 · 117 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
思路:递归 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSymmetric(Tree..原创 2022-02-14 03:34:13 · 270 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
思路:递归 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* mirrorTree(..原创 2022-01-30 06:49:06 · 528 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
s思路:递归 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSubStructu...原创 2022-01-30 06:43:50 · 176 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制: 0 <= 链表长度 <= 1000 思路:和归并排序一样就行了 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode.原创 2022-01-30 06:28:18 · 167 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 ..原创 2022-01-30 06:17:40 · 430 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 示例2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 ×..原创 2022-01-30 06:10:04 · 682 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
思路:首先我们要明白二叉树先序遍历和中序遍历的性质,在中序遍历中,如果一个点在他在左边,那么就是在他的左子树,如果在右边,就是在右子树,那我们可以用递归来解决划分左右子树。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(N..原创 2022-01-30 05:44:41 · 870 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子? 示例 1: 输入:m = 2, n = 3, k = 1 输出:3 示例 2: 输入:m .原创 2022-01-30 04:36:55 · 194 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路:直接遍历 然后存储,简单。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : ..原创 2022-01-30 04:19:15 · 1439 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 思路:直接换吧,太简单了 class Solution { public: string replaceSpace(string s) { string s1; for(char a:s){ if..原创 2022-01-30 00:49:11 · 310 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
思路:dfs路径+回溯 class Solution { public: bool exist(vector<vector<char>>& board, string word) { for(int i=0;i<board.size();i++){ for(int j=0;j<board[i].size();j++){ if(dfs(board,i,j,word,0)) ...原创 2022-01-30 00:46:32 · 308 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在重复元素值的数组numbers,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 思路:直接找最小的就行了。 class Solution { public: ...原创 2022-01-29 23:29:14 · 77 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 示例 3: 输入:n = 0 输出:1 提示: 0 <= n <= 100 思路:其实就是斐波那契数列,用记忆化搜索写吧,比较快。 class Solution { vector<..原创 2022-01-29 23:21:05 · 92 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target=...原创 2022-01-29 23:14:17 · 129 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 思路:简单 class Solution { public: int findRepeatNumber(vector<in...原创 2022-01-28 19:11:23 · 159 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0,F(1)= 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 思路:简单的记忆化搜索 class Solution { private:...原创 2022-01-28 19:01:13 · 155 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 思路:题目比较简单,使用两个栈,我们知道栈是后进先出,队列是先进先出,那么栈颠倒了就是队列的顺序,我们只要在出队的那个栈如果是空的话,那么就把入队的那个栈颠倒到出队那个栈,如果是非空的话,就直接出栈就行。 class CQueue { private: stack<.原创 2022-01-28 18:48:12 · 291 阅读 · 0 评论