classSolution{
public:
vector<int>spiralOrder(vector<vector<int>>& matrix){
if(matrix.empty())return{
};
vector<int> res;int l =0;int r = matrix[0].size()-1;int u =0;int d = matrix.size()-1;while(true){
for(int i = l; i <= r; i++){
res.push_back(matrix[u][i]);}if(++u > d)break;for(int i = u; i <= d; i++){
res.push_back(matrix[i][r]);}if(--r < l)break;for(int i = r; i >= l; i--){
res.push_back(matrix[d][i]);}if(--d < u)break;for(int i = d; i >= u; i--){
res.push_back(matrix[i][l]);}if(++l > r)break;}return res;}};
28. 剑指 Offer 30 包含min函数的栈
classMinStack{
public:
stack<int> st;
stack<int> minStack;/** initialize your data structure here. *///构造函数清空栈容器MinStack(){
while(!st.empty()){
st.pop();}while(!minStack.empty()){
minStack.pop();}//初始化最小栈的栈顶元素为最大值,为了防止top访问空指针报错
minStack.push(INT_MAX);}voidpush(int x){
st.push(x);int minval = std::min(minStack.top(), x);
minStack.push(minval);}voidpop(){
st.pop();
minStack.pop();}inttop(){
return st.top();}intmin(){
return minStack.top();}};/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
29. 剑指 Offer 31 栈的压入、弹出序列
classSolution{
public:boolvalidateStackSequences(vector<int>& pushed, vector<int>& popped){
stack<int> st;//辅助栈int cur =0;//弹出序列中的当前元素for(int i =0; i < pushed.size(); i++){
st.push(pushed[i]);// 入栈操作while(!st.empty()&& st.top()== popped[cur]){
st.pop();//出栈操作++cur;}}return st.empty();}};
30. 剑指 Offer 32 - I 从上到下打印二叉树
/**
* 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:
vector<int>levelOrder(TreeNode* root){
//层序遍历
queue<TreeNode*> que;if(root !=nullptr) que.push(root);
vector<int> res;while(!que.empty()){
int size = que.size();for(int i =0; i < size; i++){
TreeNode* node = que.front();
que.pop();
res.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return res;}};
31. 剑指 Offer 32 - II 从上到下打印二叉树 II
/**
* 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:
vector<vector<int>>levelOrder(TreeNode* root){
queue<TreeNode*> que;if(root !=nullptr) que.push(root);
vector<vector<int>> res;while(!que.empty()){
int size = que.size();
vector<int> vec;for(int i =0; i < size; i++){
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}
res.push_back(vec);}return res;}};
32. 剑指 Offer 32 - III 从上到下打印二叉树 III
/**
* 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:
vector<vector<int>>levelOrder(TreeNode* root){
queue<TreeNode*> que;if(root !=nullptr) que.push(root);
vector<vector<int>> res;int level =0;while(!que.empty()){
int size = que.size();
vector<int> vec;for(int i =0; i < size; i++){
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);if(node->left) que.push(node->left);if(node->right) que.push(node->right);}if(level++%2==1)reverse(vec.begin(), vec.end());
res.push_back(vec);}return res;}};
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/classSolution{
public:
Node*copyRandomList(Node* head){
//哈系表if(head ==nullptr)returnnullptr;
Node* cur = head;
unordered_map<Node*, Node*> map;//复制各节点,并建立原节点到新节点的映射while(cur !=nullptr){
map[cur]=newNode(cur->val);
cur = cur->next;}
cur = head;//构建新链表的next random指向while(cur !=nullptr){
map[cur]->next = map[cur->next];
map[cur]->random = map[cur->random];
cur = cur->next;}//返回新链表的头节点return map[head];}};
36. 剑指 Offer 36 二叉搜索树与双向链表
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/classSolution{
public:
Node *pre,*head;voiddfs(Node* cur){
if(cur ==nullptr)return;dfs(cur->left);if(pre !=nullptr) pre->right = cur;else head = cur;
cur->left = pre;
pre = cur;dfs(cur->right);}
Node*treeToDoublyList(Node* root){
if(root ==nullptr)returnnullptr;dfs(root);
head->left = pre;
pre->right = head;return head;}};
37. 剑指 Offer 37 序列化二叉树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/classCodec{
public:// Encodes a tree to a single string.
string serialize(TreeNode* root){
//bfs
string res;if(!root)return res;
queue<TreeNode*> q;
q.push(root);while(!q.empty()){
TreeNode* front = q.front();
q.pop();if(front){
res +=to_string(front->val)+',';
q.push(front->left);
q.push(front->right);}else{
res +="null,";}}return res.substr(0, res.size()-1);}// Decodes your encoded data to tree.
TreeNode*deserialize(string data){
if(data.empty())returnnullptr;
vector<string> s =split(data);
queue<TreeNode*> q;
TreeNode* root =newTreeNode(stoi(s[0]));
q.push(root);int i =1;while(!q.empty()){
TreeNode* front = q.front();
q.pop();if(s[i]!="null"){
front->left =newTreeNode(stoi(s[i]));
q.push(front->left);}++i;if(s[i]!="null"){
front->right =newTreeNode(stoi(s[i]));
q.push(front->right);}++i;}return root;}
vector<string>split(string& s){
vector<string> res;int n = s.size();int i =0;while(i < n){
int j = i +1;while(j < n && s[j]!=',')++j;
res.push_back(s.substr(i, j - i));
i = j +1;}return res;}};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));
38. 剑指 Offer 38 字符串的排列
classSolution{
public:
vector<string> res;voiddfs(string s,int x){
if(x == s.size()-1){
res.push_back(s);return;}
set<int> st;for(int i = x; i < s.size(); i++){
if(st.find(s[i])!= st.end())continue;
st.insert(s[i]);swap(s[i], s[x]);dfs(s, x +1);swap(s[i], s[x]);}}
vector<string>permutation(string s){
dfs(s,0);return res;}};
39. 剑指 Offer 39 数组中出现次数超过一半的数字
classSolution{
public:intmajorityElement(vector<int>& nums){
//摩尔投票法int x =0, votes =0;for(int num : nums){
if(votes ==0) x = num;
votes += num == x ?1:-1;}return x;}};classSolution{
public:intmajorityElement(vector<int>& nums){
sort(nums.begin(), nums.end());return nums[nums.size()/2];}};
40. 剑指 Offer 40 最小的k个数
classSolution{
public:voidquicksort(vector<int>& v,int start,int end){
if(start >= end){
return;}int base = v[end];int left = start;int right = end -1;while(left < right){
while(left < right && v[left]< base){
left++;}while(left < right && v[right]>= base){
right--;}
std::swap(v[left], v[right]);}if(v[left]>= v[end]){
std::swap(v[left], v[end]);}else{
left++;}if(start < left -1){
quicksort(v, start, left -1);}if(left +1< end){
quicksort(v, left +1, end);}return;}
vector<int>getLeastNumbers(vector<int>& arr,int k){
quicksort(arr,0, arr.size()-1);
vector<int> res;
res.assign(arr.begin(), arr.begin()+ k);return res;}};