题目描述:
给你一个长度为 n
的整数数组 nums
,请你求出每个长度为 k
的子数组的 美丽值 。
一个子数组的 美丽值 定义为:如果子数组中第 x
小整数 是 负数 ,那么美丽值为第 x
小的数,否则美丽值为 0
。
请你返回一个包含 n - k + 1
个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k
的子数组的 美丽值 。
数据范围:
$1\le n \le 10^5, 1\le k \le n, 1\le x \le k, -50 \le nums[i] \le 50$
题解:
观察数据范围,发现 $nums[i]$ 的数据范围很小,可以直接使用 $hash$ 得到窗口内所有值的数量,然后暴力遍历这个窗口就行。
长度固定的滑动窗口。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| auto optimize_cpp_stdio = []() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); return 0; }(); class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const int INF = 0x3f3f3f3f; vector<int> getSubarrayBeauty(vector<int> &nums, int k, int x) { int n = nums.size(); vector<int> cnt(102, 0); int l = 0; vector<int> ans(n - k + 1); for (int r = 0; r < n; ++r) { cnt[nums[r] + 50]++; while (r - l + 1 > k) { cnt[nums[l] + 50]--; l++; }
if (r - l + 1 == k) { int tmp = 0; int minx = 0; for (int j = 0; j < 50; ++j) { if (tmp + cnt[j] >= x) { minx = j - 50; break; } tmp += cnt[j]; } ans[l] = minx; } } return ans; } };
|