剑指offer全解
Ray.C.L
不开longlong见祖宗
展开
-
剑指offer——88. 树中两个结点的最低公共祖先
思路:如果他的左右子树包含p,q那么答案就是当前的root,否则看2个子树是否有答案。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solut.原创 2021-05-27 12:01:01 · 114 阅读 · 0 评论 -
剑指offer——87. 把字符串转换成整数
思路:去除空格,正负号判断,判断数字代码:class Solution {public: int strToInt(string str) { int k=0; while(k<str.size()&&str[k]==' ')k++; bool is_minus=false; if(str[k]=='+')k++; else if(str[k]=='-').原创 2021-05-27 11:30:45 · 100 阅读 · 0 评论 -
剑指offer——86. 构建乘积数组
思路:分段求解代码:class Solution {public: vector<int> multiply(const vector<int>& A) { if(A.empty())return vector<int>(); int n=A.size(); vector<int> res(n,1); for(int i=0,m=1;i<n;i++).原创 2021-05-27 11:12:43 · 54 阅读 · 0 评论 -
剑指offer——85. 不用加减乘除做加法
思路:位运算,a+b=(a^b)+((a&b)<<1)代码:class Solution {public: int add(int num1, int num2){ while(num2){ int sum=num2^num1; int carry=(num1&num2)<<1; num2=carry; num1=sum; }.原创 2021-05-27 10:44:06 · 109 阅读 · 0 评论 -
剑指offer——84. 求1+2+…+n
思路:dfs代码:class Solution {public: int getSum(int n) { int res=n; if(n==1)return 1; res+=getSum(n-1); return res; }};原创 2021-05-27 10:25:01 · 106 阅读 · 0 评论 -
剑指offer——83. 股票的最大利润
思路:按顺序最低价格时买入,最高时卖出,用minv维护前i天的最小值,不断更新最大值代码:class Solution {public: int maxDiff(vector<int>& nums) { if(nums.empty()) return 0; int res=0; for(int i=0,minv=nums[0];i<nums.size();i++){ res=max(res,nu.原创 2021-05-27 10:19:01 · 121 阅读 · 0 评论 -
剑指offer——82. 圆圈中最后剩下的数字
思路:dp[n][m]表示n个数字删除第m个数字剩下的数字标号,dp[n][m]要由有dp[n-1][m]得出,dp[n-1][m]的编号对应dp[n][m]的新编号的关系是 (x+m)%n代码:class Solution {public: int lastRemaining(int n, int m){ if(n==1)return 0; return (lastRemaining( n-1, m)+m)%n; }};...原创 2021-05-26 16:24:34 · 145 阅读 · 0 评论 -
剑指offer——81. 扑克牌的顺子
思路:最大值最小值之差小于等于4,不能有个重复的数,代码:class Solution {public: bool isContinuous( vector<int> numbers ) { if(numbers.empty())return false; sort(numbers.begin(),numbers.end()); int k=0; while(!numbers[k])k++; for(.原创 2021-05-26 16:02:14 · 135 阅读 · 0 评论 -
剑指offer——80. 骰子的点数
思路:dp[i][j]表示用i个筛子扔出点数之和为j的次数,那么可得dp[i][j]是∑k=16dp[i−1][j−k]\sum_{k=1}^6 dp[i-1][j-k]∑k=16dp[i−1][j−k]所得代码:class Solution {public: vector<int> numberOfDice(int n) { vector<vector<int>> dp(n+1,vector<int>(n*6+1,0));.原创 2021-05-26 15:42:17 · 99 阅读 · 0 评论 -
剑指offer——79. 滑动窗口的最大值
思路:单调栈代码:class Solution {public: vector<int> maxInWindows(vector<int>& nums, int k) { vector<int> res; deque<int>q; for(int i=0;i<nums.size();i++){ while(q.size()&&q.front().原创 2021-05-26 15:11:54 · 116 阅读 · 0 评论 -
剑指offer——78. 左旋转字符串
代码:class Solution {public: string leftRotateString(string str, int n) { reverse(str.begin(),str.end()); reverse(str.begin(),str.begin()+str.size()-n); reverse(str.begin()+str.size()-n,str.end()); return str; }};.原创 2021-05-26 14:39:28 · 100 阅读 · 0 评论 -
剑指offer——77. 翻转单词顺序
思路:先把整个字符串倒序,然后翻转每个单词代码:class Solution {public: string reverseWords(string s) { reverse(s.begin(),s.end()); for(int i=0;i<s.size();i++){ int j=i; while(j<s.size()&&s[j]!=' ')j++; rev.原创 2021-05-26 14:29:01 · 117 阅读 · 0 评论 -
剑指offer——76. 和为S的连续正数序列
思路:尺取代码:class Solution {public: vector<vector<int> > findContinuousSequence(int sum) { vector<vector<int>> res; for(int i=1,j=1,s=1;i<=sum;i++){ while(s<sum) s+=++j; if(s==sum&am.原创 2021-05-25 17:35:17 · 92 阅读 · 0 评论 -
剑指offer——75. 和为S的两个数字
代码:class Solution {public: vector<int> findNumbersWithSum(vector<int>& nums, int target) { unordered_map<int,int> hash; for(auto x:nums){ if(hash[target-x]) return vector<int>{x,tar.原创 2021-05-25 16:12:03 · 95 阅读 · 0 评论 -
剑指offer——74. 数组中唯一只出现一次的数字
思路:看每一位1的数量代码:class Solution {public: int findNumberAppearingOnce(vector<int>& nums) { int ans=0; for(int i=31;i>=0;i--){ int cnt=0; for(auto x:nums) if(x>>i&1) cnt+.原创 2021-05-25 15:59:12 · 102 阅读 · 0 评论 -
剑指offer——73. 数组中只出现一次的两个数字
思路:通过异或和我们可以知道最后要求的2个数x^y的值,我们找x ^y的值中K位(二进制位)是1,我们通过这一位吧原数组划分为2个集合,K位是1的集合,K位是0的集合,这2个集合的异或值就是x ^y,由此可得x,y代码:class Solution {public: vector<int> findNumsAppearOnce(vector<int>& nums) { int sum=0,k=0; for(auto x:nums.原创 2021-05-25 15:29:33 · 106 阅读 · 0 评论 -
剑指offer——72. 平衡二叉树
思路:求左右子树深度,看深度之差是否大于1代码:/** * 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.原创 2021-05-25 15:10:46 · 105 阅读 · 0 评论 -
剑指offer——71. 二叉树的深度
思路:dfs代码:/** * 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: int treeDepth(TreeN.原创 2021-05-25 15:00:57 · 106 阅读 · 0 评论 -
剑指offer——70. 二叉搜索树的第k个结点
思路:中序遍历找第K个节点代码:/** * 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* an.原创 2021-05-25 14:47:52 · 99 阅读 · 0 评论 -
剑指offer——69. 数组中数值和下标相等的元素
思路1:二分代码:class Solution {public: int getNumberSameAsIndex(vector<int>& nums) { int l=0,r=nums.size()-1; while(l<r){ int mid=l+r+1>>1; if(nums[mid]-mid<=0) l=mid; else r=mid-1.原创 2021-05-24 15:47:23 · 102 阅读 · 0 评论 -
剑指offer——68. 0到n-1中缺失的数字
思路1:二分代码:class Solution {public: int getMissingNumber(vector<int>& nums) { int l=0,r=nums.size(); while(l<r){ int mid=l+r>>1; if(nums[mid]>mid) r=mid; else l=mid+1;.原创 2021-05-23 08:54:06 · 123 阅读 · 0 评论 -
剑指offer——67. 数字在排序数组中出现的次数
思路1:二分代码:class Solution {public: int getNumberOfK(vector<int>& nums , int k) { if(nums.empty()) return 0; int l=0,r=nums.size()-1; while(l<r){ int mid=l+r>>1; if(nums[mid]<k) l=mid+1; .原创 2021-05-22 17:11:42 · 109 阅读 · 0 评论 -
剑指offer——66. 两个链表的第一个公共结点
思路1:链表A跑一遍若无公共点从B再跑一遍,B跑完如无公共点,从A跑。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *findFirstCom.原创 2021-05-22 16:06:22 · 124 阅读 · 0 评论 -
剑指offer——64. 字符流中第一个只出现一次的字符
思路1:在字符流中,我们只记录有贡献的答案,即hash值为1的,大于1的全部舍弃代码:class Solution{public: //Insert one char from stringstream queue<char> q; unordered_map<char,int> hash; void insert(char ch){ hash[ch]++; if(hash[ch]>1){ .原创 2021-05-22 15:41:58 · 109 阅读 · 0 评论 -
剑指offer——57. 数字序列中某一位的数字
代码:class Solution {public: int digitAtIndex(int n) { long long i=1,s=9,base=1; while(n>i*s){ n-=i*s; i++; s*=10; base*=10; } int number=base+(n+i-1)/i-1; int .原创 2021-05-22 15:25:39 · 90 阅读 · 0 评论 -
剑指offer——63. 字符串中第一个只出现一次的字符
代码:class Solution {public: char firstNotRepeatingChar(string s) { unordered_map<char,int> hash; for(auto x:s) hash[x]++; for(auto x:s) if(hash[x]==1) return x; return '#'; }};原创 2021-05-22 15:09:18 · 122 阅读 · 0 评论 -
剑指offer——62. 丑数
思路:每次同步拓展2 ,3,5的倍数的最小值,归并到同一数组代码:class Solution {public: int getUglyNumber(int n) { vector<int> res(1,1); int i=0,j=0,k=0; while(--n){ int t=min(res[i]*2,min(res[j]*3,res[k]*5)); res.push_back(t.原创 2021-05-22 11:39:42 · 51 阅读 · 0 评论 -
剑指offer——61. 最长不含重复字符的子字符串
思路:尺取,判断条件为连续字符串不能有相同字母。代码:class Solution {public: int longestSubstringWithoutDuplication(string s) { unordered_map<char,int> hash; int res=0,l=0; for(int i=0;i<s.size();i++){ hash[s[i]]++; .原创 2021-05-21 17:37:34 · 128 阅读 · 0 评论 -
剑指offer——60. 礼物的最大价值
思路:f[i][j]表示到达点i,j的最大值。因为只能从2个方向到达i,j那么可得f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j]代码:class Solution {public: int getMaxValue(vector<vector<int>>& grid) { int n=grid.size(),m=grid[0].size(); vector<vector<int>.原创 2021-05-21 17:27:35 · 98 阅读 · 0 评论 -
剑指offer——59. 把数字翻译成字符串
思路:f[i]表示前i位翻译的不同方法数,由题可知只有在数字是10-25的数才会有2种翻译,那么我们就判断i位置前2位是否是10-25如果是,那么根据加法原理f[i]=f[i-1]+f[i-2]代码:class Solution {public: int getTranslationCount(string s) { int n=s.size(); vector<int> f(n+1); f[0]=1; for(int i=.原创 2021-05-21 10:41:51 · 57 阅读 · 0 评论 -
剑指offer——58. 把数组排成最小的数
思路:比较字典序,当a<b时那么 ab<ba 吧拼接后的字典序小的优先排前面。代码:class Solution {public: static bool cmp(int a,int b) { string x=to_string(a),y=to_string(b); return x+y<y+x; } string printMinNumber(vector<int>& nums) { .原创 2021-05-21 10:08:42 · 110 阅读 · 0 评论 -
剑指offer——65. 数组中的逆序对
思路:归并求逆序对代码:class Solution {public: int merge(vector<int> &nums,int l,int r){ if(l>=r) return 0; vector<int> tmp; int mid=l+r>>1; int res=merge(nums,l,mid)+merge(nums,mid+1,r); int i=.原创 2021-05-19 19:36:58 · 95 阅读 · 0 评论 -
剑指offer——56. 从1到n整数中1出现的次数
思路:算每一位1的出现次数代码:class Solution {public: int numberOf1Between1AndN_Solution(int n) { vector<int> nums; int res=0; while(n) nums.push_back(n%10),n/=10; for(int i=nums.size()-1;i>=0;i--){ int t=1,le.原创 2021-05-19 19:00:10 · 90 阅读 · 0 评论 -
剑指offer——54. 数据流中的中位数
思路:对顶堆维护中位数,大根堆存小的数,小根堆存大的数,插入时执行2个操作,当大根堆堆顶大于小根堆时,交换堆顶元素,大根堆元素始终之比小根堆多1个。代码:class Solution {public: priority_queue<int> max_heap; priority_queue<int,vector<int>,greater<int> > min_heap; void insert(int num){ .原创 2021-05-19 18:27:38 · 92 阅读 · 0 评论 -
剑指offer——51. 数字排列
代码:class Solution {public: vector<vector<int>> permutation(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(),nums.end()); do{ res.push_back(nums); }while(nex.原创 2021-05-19 17:02:14 · 113 阅读 · 0 评论 -
剑指offer——52. 数组中出现次数超过一半的数字
思路:用sum表示pre出现出现次数。因为答案出现次数大于一半,最后保留的pre一定是答案。代码:class Solution {public: int moreThanHalfNum_Solution(vector<int>& nums) { int sum=0,pre=-1; for(auto x:nums) { if(x==pre) sum++; els.原创 2021-05-19 16:54:32 · 136 阅读 · 0 评论 -
剑指offer——50. 序列化二叉树
思路:前序遍历出序列化串,前序遍历串,注意null符的分隔,获得链表。代码:/** * 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 {pu.原创 2021-05-19 16:41:48 · 100 阅读 · 0 评论 -
剑指offer——55. 连续子数组的最大和
代码:class Solution {public: const int inf=0x3f3f3f; int maxSubArray(vector<int>& nums) { int sum=0,res=-inf; for(int i=0;i<nums.size();i++) { sum+=nums[i]; res=max(res,sum); .原创 2021-05-19 16:11:53 · 93 阅读 · 0 评论 -
剑指offer——49. 二叉搜索树与双向链表
思路:中序遍历就是我们要的顺序,用一个pair去存储一个子树的最左节点和最右节点,然后把他们拼接起来。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */cla.原创 2021-05-19 15:52:44 · 49 阅读 · 0 评论 -
剑指offer——48. 复杂链表的复刻
思路:将原链表每个点拷贝一个在原链表后面,然后一个一个取出来。记得恢复原始链表。代码:/** * Definition for singly-linked list with a random pointer. * struct ListNode { * int val; * ListNode *next, *random; * ListNode(int x) : val(x), next(NULL), random(NULL) {} * }; */class .原创 2021-05-18 16:40:25 · 130 阅读 · 0 评论