/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/classSolution{
public:
TreeNode*buildTree(vector<int>& preorder, vector<int>& inorder){
int n = preorder.size();returndfs(preorder, inorder,0, n -1,0, n -1);}
TreeNode*dfs(vector<int>& preorder, vector<int>& inorder,int preleft,int preright,int inleft,int inright){
if(preleft > preright)returnnullptr;
TreeNode* root =newTreeNode(preorder[preleft]);int k = inleft;for(; k <= inright;++k){
if(inorder[k]== preorder[preleft]){
break;}}
root->left =dfs(preorder, inorder, preleft +1, preleft + k - inleft, inleft, k -1);
root->right =dfs(preorder, inorder, preleft + k - inleft +1, preright, k +1, inright);return root;}};
6. 剑指 Offer 09 用两个栈实现队列
classCQueue{
public:
stack<int> st1;
stack<int> st2;CQueue(){
}voidappendTail(int value){
st1.push(value);}intdeleteHead(){
if(!st2.empty()){
int a = st2.top();
st2.pop();return a;}if(st1.empty()){
return-1;}while(!st1.empty()){
st2.push(st1.top());
st1.pop();}int res = st2.top();
st2.pop();return res;}};/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
7. 剑指 Offer 10- I 斐波那契数列
classSolution{
public:intfib(int n){
if(n ==0)return0;if(n ==1)return1;int a =0, b =1, res =0;for(int i =2; i <= n;++i){
res =(a + b)%1000000007;
a = b;
b= res;}return res %1000000007;}};
8. 剑指 Offer 10- II 青蛙跳台阶问题
classSolution{
public:intnumWays(int n){
if(n <=1)return1;if(n ==2)return2;int a =1, b =2, res =1;for(int i =3; i <= n;++i){
res =(a + b)%1000000007;
a = b;
b = res;}return res %1000000007;}};
9. 剑指 Offer 11 旋转数组的最小数字
//循环遍历 O(n)classSolution{
public:intminArray(vector<int>& numbers){
int min = numbers[0];for(int i =1; i < numbers.size();++i){
if(numbers[i]< min){
min = numbers[i];}}return min;}};//二分O(logn)classSolution{
public:intminArray(vector<int>& numbers){
int left =0, right = numbers.size()-1;while(left < right){
if(numbers[left]< numbers[right])return numbers[left];int mid = left +(right - left )/2;if(numbers[mid]> numbers[right]) left = mid +1;elseif(numbers[mid]< numbers[right]) right = mid;else--right;}return numbers[right];}};
10. 剑指 Offer 12 矩阵中的路径
classSolution{
public:int rows, cols;booldfs(vector<vector<char>>& board, string word,int i,int j,int k){
if(i >= rows || i <0|| j >= cols || j <0|| board[i][j]!= word[k])returnfalse;if(k == word.size()-1)returntrue;
board[i][j]='\0';bool res =dfs(board, word, i +1, j , k +1)||dfs(board, word, i -1, j, k +1)||dfs(board, word, i, j +1, k +1)||dfs(board, word, i, j -1, k +1);
board[i][j]= word[k];return res;}boolexist(vector<vector<char>>& board, string word){
rows = board.size();
cols = board[0].size();for(int i =0; i < rows; i++){
for(int j =0; j < cols; j++){
if(dfs(board, word, i, j,0))returntrue;}}returnfalse;}};
11. 剑指 Offer 13 机器人的运动范围
//深度优先遍历dfsclassSolution{
public:intmovingCount(int m,int n,int k){
if(m <=0|| n <=0|| k <0){
return0;}
vector<vector<bool>>visited(m,vector<bool>(n,0));int count =dfs(0,0, visited, m, n, k);return count;}private:intdfs(int i,int j, vector<vector<bool>>& visited,int m,int n,int k){
int cnt =0;if(check(i, j, visited, m, n, k)){
visited[i][j]=true;
cnt =1+dfs(i -1, j, visited, m, n, k)+dfs(i +1, j, visited, m, n, k)+dfs(i, j -1, visited, m, n, k)+dfs(i, j +1, visited, m, n, k);}return cnt;}boolcheck(int i,int j, vector<vector<bool>>& visited,int m,int n,int k){
int zongsum =getsum(i)+getsum(j);if(i >=0&& i < m && j >=0&& j < n && zongsum <= k &&!visited[i][j])returntrue;returnfalse;}intgetsum(int num){
int sum =0;while(num !=0){
sum += num %10;
num = num /10;}return sum;}};//广度优先遍历bfs
classSolution{
public:intcuttingRope(int n){
if(n <=3)return n -1;if(n ==4)return4;long res =1;while(n >4){
res *=3;
res %=1000000007;
n -=3;}return res * n %1000000007;}};
14. 剑指 Offer 15 二进制中1的个数
classSolution{
public:inthammingWeight(uint32_t n){
int count =0;while(n){
n = n &(n -1);
count++;}return count;}};classSolution{
public:inthammingWeight(uint32_t n){
int count =0;unsignedint flag =1;while(flag){
if(n & flag){
count++;}
flag = flag <<1;}return count;}};
15. 剑指 Offer 16 数值的整数次方
classSolution{
public:doublemyPow(double x,int n){
longlong b = n;double res =1.0;while(b){
if(b <0){
x =1/ x;
b =-b;}if(b &1==1){
res = res * x;}
x = x * x;
b >>=1;}return res;}};
16. 剑指 Offer 17 打印从1到最大的n位数
classSolution{
public:
vector<int> nums;
string s;
vector<int>printNumbers(int n){
s.resize(n,'0');dfs(n,0);return nums;}voiddfs(int end,int index){
if(index == end){
save();return;}for(int i =0; i <=9; i++){
s[index]= i +'0';dfs(end, index +1);}}voidsave(){
int ptr =0;while(ptr < s.size()&& s[ptr]=='0') ptr++;if(ptr != s.size()){
nums.emplace_back(stoi(s.substr(ptr)));}}};