leetcode 795. Number of Subarrays with Bounded Maximum | 795. 区间子数组个数(Java)

x33g5p2x  于2021-12-24 转载在 Java  
字(0.8k)|赞(0)|评价(0)|浏览(326)

题目

https://leetcode.com/problems/number-of-subarrays-with-bounded-maximum/

题解

一看数据规模,这题只能 O(1)

乍一看,以为是单调栈。一画图,发现是一个排列组合问题。思路如下:

首先,将大于 right 的数字圈出来,看作是挡板,把整个数组分割成好几个段。
每个段中,包含小于 left 的数字,这些数字是不能单独成群的。
所以每个段中的所有可能组合数量 = 段内所有可能组合数量 - 不能单独成群的数字的组合数量。
计算组合数量的时候,用等差求和公式 1+2+3+...+n = (首项+末项)*项数/2

  1. class Solution {
  2. public int numSubarrayBoundedMax(int[] nums, int left, int right) {
  3. long result = 0;
  4. long valid = 0; // 连续的小于等于right个数
  5. long below = 0; // 连续的小于left个数
  6. if (nums[0] <= right) valid++;
  7. if (nums[0] < left) below++;
  8. for (int i = 1; i < nums.length; i++) {
  9. if (nums[i] > right) { // above
  10. if (valid > below) {
  11. result += (1 + valid) * valid / 2;
  12. result -= (1 + below) * below / 2;
  13. }
  14. valid = 0;
  15. below = 0;
  16. } else if (nums[i] < left) { // below
  17. valid++;
  18. below++;
  19. } else { // middle
  20. valid++;
  21. if (nums[i - 1] < left) {
  22. result -= (1 + below) * below / 2;
  23. }
  24. below = 0;
  25. }
  26. }
  27. // 清算末尾
  28. result -= (1 + below) * below / 2;
  29. result += (1 + valid) * valid / 2;
  30. return (int) result;
  31. }
  32. }

相关文章

最新文章

更多