A题
【2089. 找出数组排序后的目标下标】
C++
STL的二分函数
class Solution {public: vector<int> targetIndices(vector<int>& nums, int target) { vector<int> vec; sort(nums.begin(), nums.end()); auto begin = lower_bound(nums.begin(), nums.end(), target); auto end = upper_bound(nums.begin(), nums.end(), target); if (begin == nums.end()) return vec; for (auto i = begin; i != end; ++ i) vec.push_back(i - nums.begin()); return vec; }};
B题
【2090. 半径为 k 的子数组平均值】
C++
前缀和
class Solution {
public:
vector<int> getAverages(vector<int>& nums, int k) {
vector<long long> sums(nums.size() + 1);
vector<int> ans(nums.size(), -1);
if (nums.size() < 2 * k + 1) return ans;
for (auto i = 1; i <= nums.size(); ++ i) sums[i] = sums[i - 1] + nums[i - 1];
for (auto l = 0; l < nums.size() - 2 * k; ++ l) {
auto r = l + (2 * k + 1) - 1;
auto avg = (int)((sums[r + 1] - sums[l]) / (2 * k + 1));
ans[l + k] = avg;
}
return ans;
}
};
前缀和压行:
class Solution {
public:
vector<int> getAverages(vector<int>& nums, int k) {
vector<long long> sums(nums.size() + 1);
vector<int> ans(nums.size(), -1);
if (nums.size() < 2 * k + 1) return ans;
for (auto i = 1; i <= nums.size(); ++ i) sums[i] = sums[i - 1] + nums[i - 1];
for (auto l = 0; l < nums.size() - 2 * k; ++ l)
ans[l + k] = (int)((sums[l + 2 * k + 1] - sums[l]) / (2 * k + 1));
return ans;
}
};
C题
C++
STL的最值函数(没写完)
class Solution {
public:
int minimumDeletions(vector<int>& nums) {
if (nums.size() == 1) return 1;
int l = min_element(nums.begin(), nums.end())- nums.begin();
int r = max_element(nums.begin(), nums.end()) - nums.begin();
if(l > r) swap(l,r);
auto mid = nums.size() / 2;
if (l < mid && r > mid + 1) return l + 1 + nums.size() - r;
else if (l < mid && r < mid) return r + 1;
// else (l >= mid && r >= mid) return nums.size() * 2 - l - r;
else return nums.size() - l;
}
};