vector<int> spiralOrder(vector<vector<int>>& matrix){ vector<int>res; if (matrix.empty()) return res;
int up = 0; int down = matrix.size() - 1; int left = 0; int right = matrix[0].size() - 1; while (1) { //左往右 for (int i = left; i <= right; i++) res.push_back(matrix[up][i]); if (up == down)return res; up++; //上往下 for (int i = up; i <= down; i++) res.push_back(matrix[i][right]); if (left == right)return res; right--; //右往左 for (int i = right; i >= left; i--) res.push_back(matrix[down][i]); if (up == down)return res; down--; //下往上 for (int i = down; i >= up; i--) res.push_back(matrix[i][left]); if (left == right)return res; left++; } return res; }
30.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
vector<int>res; while (!q.empty()) { intsize = q.size(); for (int i = 0; i < size; i++) { TreeNode* temp = q.front(); int num = temp->val; res.push_back(num); q.pop();
if (temp->left)q.push(temp->left); if (temp->right)q.push(temp->right); } } return res; } //如果需要保存节点 //index = !index; //if(index) // res.push_back(vector<int>(arr.rbegin(), arr.rend())); //else res.push_back(arr);
boolverifyPostorder(vector<int>& postorder){ if (postorder.size() < 2)returntrue; return dfs(postorder, 0, postorder.size() - 1); } //左右中 //根节点大于左子树任意节点,小于右子树任意节点 booldfs(vector<int>& postorder, int left, int root){ if (left >= root)//只剩一个节点时候,之前已经满足了搜索二叉树的条件 returntrue;//所以还是满足,返回true
int rootValue = postorder[root];
//区分左右区间,先找左右区间的区分节点位置 int i = left; while (i < root && postorder[i] < rootValue) i++; //此时i已经是第一个右节点位置 for (int j = i; j < root; j++) if (postorder[j] < rootValue)returnfalse;
//当前树没问题,检查左树和右树 return dfs(postorder, left, i - 1) && dfs(postorder, i, root - 1); }
//序列化,利用先序遍历——中左右 stringserialize(TreeNode* root){ if (root == NULL) return"#,"; string res = to_string(root->val) + ","; res += serialize(root->left); res += serialize(root->right);
for (auto &it : vis) { if (it.second == 0) continue;
it.second--; tmp += it.first;
backtrace(s, tmp, vis);
it.second++; tmp.pop_back(); } }
39.数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
输入:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
方法:
哈希表
摩尔投票法
sorted,return中间元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//摩尔投票法 intmajorityElement(vector<int>& nums){ int res = 0; int count = 0; for (int i = 0; i < nums.size(); i++) { if (count == 0) { res = nums[i]; count++; } else { if (nums[i] != res) count--; else count++; } } return res; }
40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
输入:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
输入:arr = [0,1,2,1], k = 1
输出:[0]
方法:
各种排序
快排
归并排序等
1 2 3 4 5 6 7 8 9
vector<int> getLeastNumbers(vector<int>& arr, int k){ vector<int>res(k, 0); sort(arr.begin(), arr.end()); for (int i = 0; i != k; i++) { res[i] = arr[i];
intmaxSubArray(vector<int>& nums){ //贪心算法 // int res = nums[0]; // int sum = 0; // for(auto it:nums){ // if(sum > 0) // sum +=it; // else{ // sum = it; // } // res = max(sum ,res); // } //return res; //动态规划 int res = nums[0]; int len = nums.size(); vector<int>dp(len + 1, 0); for (int i = 1; i <= len; i++) { dp[i] = max(dp[i - 1] + nums[i - 1], nums[i - 1]); res = max(dp[i], res); } return res; }
43.1~n整数中1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
输入:
输入:n = 12
输出:5
输入:n = 13
输出:6
方法:
找规律
区分低位、高位、当前位、位因子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
intcountDigitOne(int n){ long digit = 1; int res = 0; int high = n / 10, cur = n % 10, low = 0; //1234 high_123 cur_4 low_0 while (high != 0 || cur != 0) { // 高位 * 低位为1的个数 // 然后通过对当前位进行判断,找真实的为1的个数 if (cur == 0) res += high * digit; elseif (cur == 1) res += high * digit + low + 1; else res += (high + 1) * digit;
low += cur * digit; cur = high % 10; high /= 10; digit *= 10; } return res; }
intmaxValue(vector<vector<int>>& grid){ //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) int n = grid.size(); int m = grid[0].size(); vector<vector<int>>dp(n, vector<int>(m, 0));
dp[0][0] = grid[0][0]; for (int i = 1; i < n; i++) { dp[i][0] = dp[i - 1][0] + grid[i][0]; } for (int i = 1; i < m; i++) { dp[0][i] = dp[0][i - 1] + grid[0][i]; } for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; } } return dp[n - 1][m - 1]; }