1. 给定前序遍历序列构造二叉搜索树 100%
- 由于是二叉搜索树,因此将前序遍历序列升序排序后就是中序遍历序列
相当于给定前序序列和中序序列构造二叉树
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/class Solution {private:unordered_map<int, int> inValIdxMap;TreeNode* dfs(vector<int>&preSlice, int preStart, int preEnd, int inStart, int inEnd){if(preStart > preEnd)return nullptr;int val = preSlice[preStart];TreeNode* root = new TreeNode(val);int rootIdxOfIn = inValIdxMap[val];int leftLen = rootIdxOfIn - inStart;root->left = dfs(preSlice, preStart + 1, preStart + leftLen, inStart, rootIdxOfIn - 1);root->right = dfs(preSlice, preStart + leftLen + 1, preEnd, rootIdxOfIn + 1, inEnd);return root;}public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param preSlice int整型vector 先序遍历结果数组* @return TreeNode类*/TreeNode* reConstructBST(vector<int>& preSlice) {vector<int> inSlice = preSlice;sort(inSlice.begin(), inSlice.end());for(int i = 0; i < inSlice.size(); ++i)inValIdxMap[inSlice[i]] = i;return dfs(preSlice, 0, preSlice.size() - 1, 0, preSlice.size() - 1);}};
2. 矩阵顺时针旋转90°后逆时针螺旋遍历 100%
其实就和[中等] 54. 螺旋矩阵基本一致,只是从左下角开始逆时针螺旋遍历(下边界、右边界、上边界、左边界)
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param matrix int整型vector<vector<>>* @return int整型vector*/vector<int> antiSpiralOrder(vector<vector<int> >& matrix) {if(matrix.size() == 0 || matrix[0].size() == 0)return {};int rows = matrix.size();int cols = matrix[0].size();int up = 0;int down = rows - 1;int left = 0;int right = cols - 1;vector<int> result;while(result.size() < rows * cols){if(down >= up){for(int i = left; i <= right; ++i)result.push_back(matrix[down][i]);--down;}if(right >= left){for(int i = down; i >= up; --i)result.push_back(matrix[i][right]);--right;}if(up <= down){for(int i = right; i >= left; --i)result.push_back(matrix[up][i]);++up;}if(left <= right){for(int i = up; i <= down; ++i)result.push_back(matrix[i][left]);++left;}}return result;}};
3. 求最大等比子序列长度 90.91%
求整数数组 nums 中最大等比子序列的长度。最长递增子序列可能是升序的,也可能是降序的。
卡在 90.91% 了,不知道错在哪
- 应该是下面第 23 行应该改为
list[i][div] = max(list[i][div], 1 + list[j][div]);
- 这样子其实思想就和 [中等] 300. 最长递增子序列 相同,只不过
dpi变成了这里的哈希表
- 第 12、13 行,应该还要判断,当 len == 2 时,两个数之间能否整除,因为虽然题目没要求等比的比值是整数,但是例如两个数 2、3,如果等比,比值是 2/3 或 3/2,都不存在第三个数让它们是等比数列,这种情况下应该返回 1
看到有人说解法是:最长递增子序列 + 整除判断,所以比值必须是整数(升序等比子序列) or 1/整数(降序等比子序列)? ```cpp class Solution { public: /**
- 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- @param nums int整型vector 整形数组
@return int整型 */ int longestGeometricSeqLength(vector
& nums) { int len = nums.size(); if(len <= 2) return len;
vector
> list(len); int result = 0; for(int i = 1; i < len; ++i) { for(int j = 0; j < i; ++j){if(nums[j] == 0)continue;double div = double(nums[i]) / double(nums[j]);list[i][div] = 1 + list[j][div];result = max(result, list[i][div]);}
} return result + 1;
// int result = 2; // for(int i = 0; i < len; ++i) // { // for(int j = i + 1; j < len; ++j) // { // double div = double(nums[j]) / double(nums[i]); // int pre = nums[j]; // int curlen = 2; // for(int k = j + 1; k < len; ++k) // { // if(double(nums[k]) / double(pre) == div) // { // ++curlen; // pre = nums[k]; // } // } // result = max(result, curlen); // } // } // return result; } }; ```
