classSolution { public: vector<int> topKFrequent(vector<int>& nums, int k){ vector<int> result; result.reserve(k); int len = nums.size(); unordered_map<int, int> occour; occour.reserve(len); for (auto& num : nums) ++occour[num]; vector<pair<int, int>> values; for (auto& value : occour) values.emplace_back(value); QuickChoose(values, k, 0, values.size() - 1, result); return result; } voidQuickChoose(vector<pair<int, int>>& values, int k, int left, int right, vector<int>& result) { if (left > right) return; if (left == right) { // 基本情形 result.push_back(values[left].first); return; } int picked = rand() % (right - left + 1) + left; swap(values[picked], values[left]); int pivot = values[left].second; int i = left - 1; int j = right + 1; while (i < j) { do ++i; while (values[i].second > pivot); do --j; while (values[j].second < pivot); if (i < j) swap(values[i], values[j]); } int leftCount = j - left + 1; if (k <= leftCount) QuickChoose(values, k, left, j, result); else { for (int i = left; i <= j; ++i) result.emplace_back(values[i].first); QuickChoose(values, k - leftCount, j + 1, right, result); } } };
classSolution { public: boolcanJump(vector<int>& nums){ int len = nums.size(); int maxSkip = 0; for (int i = 0; i < len; ++i) { if ( i <= maxSkip) maxSkip = max(maxSkip, i + nums[i]); if (maxSkip >= len - 1) returntrue; } returnfalse; } };
classSolution { public: intjump(vector<int>& nums){ int len = nums.size() - 1; int cur = len; int step = 0; while (cur > 0) { for (int i = 0; i <= cur; ++i) { if (i + nums[i] >= cur) { cur = i; ++step; break; } } } return step; } };
classSolution { public: intjump(vector<int>& nums){ int len = nums.size() - 1; int step = 0, maxStep = 0, end = 0; for (int i = 0; i < len; ++i) { if (i <= maxStep) maxStep = max(maxStep, i + nums[i]); if (i == end) { end = maxStep; ++step; } } return step; } };