1. 给定前序遍历序列构造二叉搜索树 100%

  1. 由于是二叉搜索树,因此将前序遍历序列升序排序后就是中序遍历序列
  2. 相当于给定前序序列和中序序列构造二叉树

    1. /**
    2. * struct TreeNode {
    3. * int val;
    4. * struct TreeNode *left;
    5. * struct TreeNode *right;
    6. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    7. * };
    8. */
    9. class Solution {
    10. private:
    11. unordered_map<int, int> inValIdxMap;
    12. TreeNode* dfs(vector<int>&preSlice, int preStart, int preEnd, int inStart, int inEnd)
    13. {
    14. if(preStart > preEnd)
    15. return nullptr;
    16. int val = preSlice[preStart];
    17. TreeNode* root = new TreeNode(val);
    18. int rootIdxOfIn = inValIdxMap[val];
    19. int leftLen = rootIdxOfIn - inStart;
    20. root->left = dfs(preSlice, preStart + 1, preStart + leftLen, inStart, rootIdxOfIn - 1);
    21. root->right = dfs(preSlice, preStart + leftLen + 1, preEnd, rootIdxOfIn + 1, inEnd);
    22. return root;
    23. }
    24. public:
    25. /**
    26. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    27. *
    28. *
    29. * @param preSlice int整型vector 先序遍历结果数组
    30. * @return TreeNode类
    31. */
    32. TreeNode* reConstructBST(vector<int>& preSlice) {
    33. vector<int> inSlice = preSlice;
    34. sort(inSlice.begin(), inSlice.end());
    35. for(int i = 0; i < inSlice.size(); ++i)
    36. inValIdxMap[inSlice[i]] = i;
    37. return dfs(preSlice, 0, preSlice.size() - 1, 0, preSlice.size() - 1);
    38. }
    39. };

2. 矩阵顺时针旋转90°后逆时针螺旋遍历 100%

其实就和[中等] 54. 螺旋矩阵基本一致,只是从左下角开始逆时针螺旋遍历(下边界、右边界、上边界、左边界)

  1. class Solution {
  2. public:
  3. /**
  4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  5. *
  6. *
  7. * @param matrix int整型vector<vector<>>
  8. * @return int整型vector
  9. */
  10. vector<int> antiSpiralOrder(vector<vector<int> >& matrix) {
  11. if(matrix.size() == 0 || matrix[0].size() == 0)
  12. return {};
  13. int rows = matrix.size();
  14. int cols = matrix[0].size();
  15. int up = 0;
  16. int down = rows - 1;
  17. int left = 0;
  18. int right = cols - 1;
  19. vector<int> result;
  20. while(result.size() < rows * cols)
  21. {
  22. if(down >= up)
  23. {
  24. for(int i = left; i <= right; ++i)
  25. result.push_back(matrix[down][i]);
  26. --down;
  27. }
  28. if(right >= left)
  29. {
  30. for(int i = down; i >= up; --i)
  31. result.push_back(matrix[i][right]);
  32. --right;
  33. }
  34. if(up <= down)
  35. {
  36. for(int i = right; i >= left; --i)
  37. result.push_back(matrix[up][i]);
  38. ++up;
  39. }
  40. if(left <= right)
  41. {
  42. for(int i = up; i <= down; ++i)
  43. result.push_back(matrix[i][left]);
  44. ++left;
  45. }
  46. }
  47. return result;
  48. }
  49. };

3. 求最大等比子序列长度 90.91%

求整数数组 nums 中最大等比子序列的长度。最长递增子序列可能是升序的,也可能是降序的。

卡在 90.91% 了,不知道错在哪

  1. 应该是下面第 23 行应该改为 list[i][div] = max(list[i][div], 1 + list[j][div]);
  1. 第 12、13 行,应该还要判断,当 len == 2 时,两个数之间能否整除,因为虽然题目没要求等比的比值是整数,但是例如两个数 2、3,如果等比,比值是 2/3 或 3/2,都不存在第三个数让它们是等比数列,这种情况下应该返回 1
  2. 看到有人说解法是:最长递增子序列 + 整除判断,所以比值必须是整数(升序等比子序列) or 1/整数(降序等比子序列)? ```cpp class Solution { public: /**

    • 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    • @param nums int整型vector 整形数组
    • @return int整型 */ int longestGeometricSeqLength(vector& nums) { int len = nums.size(); if(len <= 2)

      1. return len;

      vector> list(len); int result = 0; for(int i = 1; i < len; ++i) {

      1. for(int j = 0; j < i; ++j)
      2. {
      3. if(nums[j] == 0)
      4. continue;
      5. double div = double(nums[i]) / double(nums[j]);
      6. list[i][div] = 1 + list[j][div];
      7. result = max(result, list[i][div]);
      8. }

      } 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; } }; ```