剑指Offer
山夜曾有月归来
睡到二三更时凡功名皆成梦幻,想到一百年后无少长俱是古人
展开
-
[Leecode]31. 下一个排列
2021/4/10,题意如下:根据字典序排序的定义,从左往右扫到的第一位大的数就大。我们要优先把从左往右的第一个比它前面小的数和它后面第一个比它大的数交换,然后再把这个位置后面的从小到大排序就好了。(可以参照数字大小的判断方法,只是要求最小的排列)。c++参考代码:class Solution {public: void nextPermutation(vector<int>& nums) { int n=nums.size(); for原创 2021-04-10 21:39:54 · 141 阅读 · 0 评论 -
[剑指 Offer] 60. n个骰子的点数
2021/4/7,又是跟着K神刷题的一天,题意如下:暴力的时间复杂度是6n,肯定会超时。看了题解的动态规划思路真是妙啊。假设我们已经知道n-1个骰子各个点数的概率,那么加了一个骰子的话只是在之前各个点数的概率上乘了1/6(当然有些点数不可能出现)。可以理解为每个点数对下一个骰子各个可能出现的点数的贡献。具体实现看代码:class Solution {public: vector<double> dicesProbability(int n) { vector<dou原创 2021-04-07 18:41:26 · 81 阅读 · 0 评论 -
[剑指 Offer]56 - II. 数组中数字出现的次数 II
2021/4/6,题意如下:和之前不一样的是把出现两次改成了出现三次,一开始有两种思路,一种就是空间复杂度O(N)的用map标记一下,一种就是时间复杂度O(NlgN)的排序然后找。看了K神的题解发现了位运算的方法确实牛,就是把每一位出现的次数记下来,然后取余3就是只剩下出现一次的数了。c++参考代码:class Solution {public: int singleNumber(vector<int>& nums) { vector<int>原创 2021-04-06 19:15:33 · 100 阅读 · 0 评论 -
[剑指Offer] 45. 把数组排成最小的数(优先队列重载)
2021/4/5,记录一下学到了优先队列的重载:思路很简单,就排序就行了,先把数字转换成字符串,然后比较他们的先后顺序组成的数字哪个大就行了。一开始用了sort自定义排序,然后用了优先队列的重载(学到了优先队列重载的是小于号,我一开始用的大于号一直报错hh)sort自定义排序代码:class Solution {public:static bool cmp(int a,int b) { string x=to_string(a)+to_string(b); string y=原创 2021-04-05 21:07:52 · 70 阅读 · 0 评论 -
[剑指Offer] 38. 字符串的排列
2021/4/5,题意如下:既然是全排列思路肯定是dfs,我的思路是标记每一位已经排好顺序的字符,加入没排序的字符然后再回溯+剪枝就好了。但是有一个问题就是把相同的字符看做了不同的字符,所以如果原来的字符串中有相同的字符会出现重复的排列。所以我们要使用一个set去重就好了。c++参考代码:class Solution {public:set<string> st;bool v[10]={false};void dfs(string s,string now){ if(now原创 2021-04-05 19:55:00 · 75 阅读 · 0 评论 -
[剑指 Offer] 36. 二叉搜索树与双向链表
2021/4/4,又是跟k神学习的一天,题意如下:首先二叉搜索树顺序输出我们可以考虑中序遍历,但是这道题我们要构造双向链表,并且是把这个树转换成链表,那么我们可以根据中序遍历的思想把输出改成链接操作就可以了,并且因为是双向链表,所以我们要添加一个pre表示当前节点的前一个节点,然后链接就好了,具体实现看代码。/*// Definition for a Node.class Node {public: int val; Node* left; Node* right;原创 2021-04-04 19:21:12 · 93 阅读 · 0 评论 -
[剑指 Offer]35. 复杂链表的复制
2021/4/3,依旧是剑指Offer的一天,题意如下:第一个思路肯定是先跑一边把所有链表都记下来,然后再创建一个链表从头连起来就好了。当然这样的空间复杂度会到O(N),然后看到题解的思路顿时觉得牛哇。思路是在每个节点后再复制一个节点,然后根据原节点的random的值去让复制的这个节点去指向复制的random的值,最后再把这两个链表拆开就好了,具体做法看代码吧,膜拜大佬中orz第一种思路:/*// Definition for a Node.class Node {public: in原创 2021-04-03 21:08:15 · 71 阅读 · 0 评论 -
[剑指Offer] 33. 二叉搜索树的后序遍历序列
2021/4/2,还是要好好刷算法题啊,题意如下:二叉搜索树的特点是左子树的值都比根节点小,右子树的值都比根节点大。而后序遍历的根节点在最后,所以我们可以根据值和根节点的大小关系分为左子树和右子树。找到左子树和右子树后判断是否满足和根节点的条件,然后再用递归的思想继续判断左子树和右子树,都满足条件就返回true。c++参考代码:class Solution {public: bool pd(vector<int>& postorder,int l,int r)原创 2021-04-02 20:43:16 · 74 阅读 · 0 评论 -
[剑指Offer] 56 - I. 数组中数字出现的次数
2021/3/31,今天又学到了一个题,题意如下:首先如果只有一个数出现了一次的话,我们可以整体异或来找出这个数,因为出现两次的数在异或过程中都消除了。但是有两个数的话我们这样操作求得的值是x^y的值。所以我们可以通过找出这个值中的一个1,然候根据这个1把数字分成两组,两组分组求异或就是答案了(很巧妙)。c++参考代码:class Solution {public: vector<int> singleNumbers(vector<int>& nums) {原创 2021-03-31 16:22:03 · 77 阅读 · 0 评论 -
[剑指 Offer] 49. 丑数
2021/3/30,今天做了一个听闻已久的题:丑数。题意如下:首先判断一个数是不是丑数并不困难,让这个数一直除2,3,5直到除不尽为止,如果能除尽就是丑数。但是这个题让找第n个丑数,首先我想到的是打表,但是复杂度太高超时了。后来看了题解学习了一种做法,下一个丑数一定是之前的某一个丑数乘2,3,5乘出来的,并且是他们中最小的那一个。但是要实现这个有点困难,看了题解的代码觉得真的牛哇,具体实现看代码:class Solution {public: int nthUglyNumber(int n)原创 2021-03-30 19:33:02 · 49 阅读 · 0 评论 -
[剑指 Offer]44.数字序列中某一位的数字
2021/3/29,今天遇到有意思的题是44. 数字序列中某一位的数字,题意如下:这题一开始没有什么思路,看了题解知道了是个找规律的题。比如如果n是个三位数,那么它前面的两位数的位数是固定的,这些固定的位数我们能算出来,然后再根据剩下的位数确定n在的那一个数,然后再确定n位上的数字就行了。c++参考代码:class Solution {public: int findNthDigit(int n) { long long st=1;//每m位数的起始数 long l原创 2021-03-29 23:02:27 · 100 阅读 · 0 评论 -
[剑指Offer]14- I. 剪绳子
2021/3/28,今天做了个挺有意思的题,题意如下:最开始没啥思路,瞅了一眼题解有dp和贪心的做法。首先dp的做法就是设dp[i]是长度为i的绳子乘积最大值,遍历每一个j的值,i要么减去j的值就不减了,要么减去j之后再考虑j长度的绳子,所以状态转移方程是有dp[i]=max(dp[i],max(j*(i-j),j*dp[i-j]));c++参考代码:class Solution {public: int cuttingRope(int n) { vector<int>原创 2021-03-28 21:14:02 · 70 阅读 · 0 评论 -
[剑指Offer]12. 矩阵中的路径
2021/3/27,题意如下:其实也没啥好说的,深搜+剪枝就行了,不过代码中还是有很多细节要注意的。c++参考代码:class Solution {public: int n,m; int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool dfs(vector<vector<char>> board, string word,int i,int j,int k) { if(k==word.size()原创 2021-03-27 20:02:43 · 76 阅读 · 0 评论 -
[剑指Offer]39. 数组中出现次数超过一半的数字
2021/3/26,今天看到了个很有意思的题:这是一道面试问的题,但是想不到除了遍历标记和排序也没有什么优化的方法。然后看了一个大佬的思路顿时感觉自己还是太笨了。我们既然要求最多出现次数的数,我们可以将两两不相同的数消去,这样最后剩下的数就是出现次数超过一半的数了。c++参考代码:class Solution {public: int majorityElement(vector<int>& nums) { int now=0,sum=0; fo原创 2021-03-26 22:45:59 · 85 阅读 · 0 评论 -
[剑指Offer]12. 整数转罗马数字
2021/3/23,今天遇到一个很有意思的题,题意如下:这道题乍一看有点蒙,但是仔细思考一下可以发现规律。和找零钱问题一样我们要尽可能的使用大面值的数字。所以我们可以用贪心算法构造数组。但是需要注意的是有几种特殊情况,比如4,9,40之类的,见下图(图片来自Leecode官方题解 )我们按照这种方法构造就可以完成罗马数字的转换了。c++参考代码:class Solution {public: string intToRoman(int num) { string str[原创 2021-03-23 22:25:24 · 86 阅读 · 0 评论 -
[剑指Offer]19. 删除链表的倒数第 N 个结点
2020/3/22,今天又巩固了一下自己的链表知识。题意如下:最简单的思路就是O(N2)循环两次找,但是我们能不能O(N)实现呢?思考一下我们需要循环两次的原因是链表只能向后查找,并不知道什么时候到达尾结点。那么换个思路,我们可以使用两个指针,一个指针往后跑找尾结点,另一个指针在第一个指针的前n-1个位置,那么当第一个指针到达尾结点时,第二个指针就指的是倒数第n个节点了。想清楚后代码实现就很简单。需要注意的是链表最好新建一个节点指向头结点防止只有一个节点的特殊情况,另外此题中我使用的it指针指向的是倒原创 2021-03-22 22:43:03 · 117 阅读 · 0 评论 -
[剑指 Offer]16. 数值的整数次方
题意如下:其实就是个快速幂,遍历方法的优化。当n为偶数时,xn=xn/2·xn/2。当n为奇数时,xn=xn/2·xn/2·n。(n/2为向下取整)此题需要注意的是当n为负时可以将x变成1/n。还有当n=-231时n=-n会爆int。c++代码如下:class Solution {public: double myPow(double x, int n) { if(x==0) return 0; long long a=n;原创 2021-03-21 21:33:23 · 42 阅读 · 0 评论 -
[剑指Offer]15. 二进制中1的个数
今天觉得值得记录的题是15. 二进制中1的个数,题意如下:首先最基础的思路肯定是遍历每一为,然后数1的个数。代码如下:class Solution {public: int hammingWeight(uint32_t n) { int ans=0; while(n) { ans+=n&1;//n&1如果n最后一位为1的话值为1. n>>=1;//n向右移一位原创 2021-03-20 23:28:46 · 55 阅读 · 0 评论 -
[剑指Offer]07. 重建二叉树
为了面试做准备!开始刷剑指Offer,今天做的值得记录的是07. 重建二叉树,题意如下:我们知道前序遍历的第一个是根节点,而中序遍历从根节点处把序列分为了左子树,根节点,右子树。所以我们可以根据前序遍历找根节点,根据中序遍历划分子树。使用递归的方法把大问题转化成为小问题。具体还有很多小细节,见代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;原创 2021-03-19 19:22:08 · 44 阅读 · 0 评论