赞
踩
Leetcode第335场周赛,一共4道题,时间1.5h
比赛链接
步骤:
int passThePillow(int n, int time)
{
int mod = time % (n - 1);
int sindou = time / (n - 1);
return sindou % 2 ? n - mod : 1 + mod;
}
int getDepth(TreeNode *root) { if (root == NULL) return 0; else { return max(getDepth(root->left), getDepth(root->right)) + 1; } } vector<long long> getLevelSum(TreeNode *root, int total) { queue<pti> qt; vector<long long> levelSum(total + 1, 0); qt.push(make_pair(root, 1)); while (!qt.empty()) { pti tp = qt.front(); levelSum[tp.second] += tp.first->val; qt.pop(); if (tp.first->left != NULL) { qt.push(make_pair(tp.first->left, tp.second + 1)); } if (tp.first->right != NULL) { qt.push(make_pair(tp.first->right, tp.second + 1)); } } return levelSum; } long long kthLargestLevelSum(TreeNode *root, int k) { vector<long long> ans; int total = getDepth(root); if (total < k) { return -1; } else ans = getLevelSum(root, total); sort(ans.rbegin(), ans.rend()); return ans[k - 1]; }
vector<long long> sum; void dfs(TreeNode *root, int dep) { if (root == nullptr) return; if (sum.size() == dep) sum.push_back(0); sum[dep] += root->val; dfs(root->left, dep + 1); dfs(root->right, dep + 1); } long long kthLargestLevelSum(TreeNode *root, int k) { dfs(root, 0); if (sum.size() < k) return -1; sort(sum.begin(), sum.end()); return sum[sum.size() - k]; }
本次周赛最难的题(比最后一题难),思考过程如下:
nums
范围找最小的i
满足要求,那么 “哪些地方的i
不能取” ?nums
出现的最左、右的下标i,j
,那么答案不能在[i,j)
里面于是有了具体步骤:
left
每个质数最左边出现的位置,right[i]=j
表示每个位置最右边到的位置,则right
就已经记录了[i,j)
的信息,也就是所有不能取得区间int findValidSplit(vector<int> &nums) { unordered_map<int, int> left; vector<int> right(nums.size(), 0); auto f = [&](int p, int i) { auto it = left.find(p); if (it == left.end()) left[p] = i; // 第一次遇到质数 p else { right[it->second] = i; // 记录左端点 l 对应的右端点的最大值 } }; // 分解质因数 for (int n = 0; n < nums.size(); n++) { int tp = nums[n], d = 2; while (d * d <= tp) { if (tp % d == 0) { f(d, n); while (tp % d == 0) { tp /= d; } } d++; } if (tp > 1) f(tp, n); } // 开始找区间,若到了空位(不在任何区间内) int ans = 0; for (int i = 0; i <= nums.size() - 1; i++) { if (i > ans) return ans; ans = max(ans, right[i]); } return -1; }
dp[i][j]
表示前i
类型获得j
体积的拿法dp[i][j] = dp[i][j]+ dp[i - 1][j - n * types[i - 1][1]]
n
属于1,2,,,,,j / types[i-1][1]
)int waysToReachTarget(int target, vector<vector<int>> &types) { vector<vector<int>> dp(types.size() + 1, vector<int>(1001, 0)); for (int i = 0; i <= types.size(); i++) { for (int j = 0; j <= target; j++) { if (i == 0 && j == 0) dp[i][j] = 1; else if (i == 0 && j != 0) dp[i][j] = 0; else if (j == 0) { dp[i][j] = 1; } else { int tp = 0; while (tp <= types[i - 1][0]) { if (j - tp * types[i - 1][1] >= 0) { dp[i][j] = (dp[i][j] % 1000000007 + dp[i - 1][j - tp * types[i - 1][1]] % (1000000007)) % (1000000007); } else break; tp++; } } } } cout << dp[types.size()][target] << endl; return dp[types.size()][target]; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。