华为OD机试真题-优雅数组【2023Q2】【JAVA、Python、C++】

发布于:2023-10-25 ⋅ 阅读:(91) ⋅ 点赞:(0)

题目描述:

如果一个数组中出现次数最多的元素出现大于等于k次,被称为`k-优雅数组`,k也可以被称为`优雅阈值`。

例如,数组`[1, 2, 3, 1, 2, 3, 1]`,它是一个`3-优雅数组`,因为元素`1`出现次数大于等于3次,数组`[1, 2, 3, 1, 2]`就不是一个`3-优雅数组`,因为其中出现次数最多的元素时`1`和`2`,只出现了2次。

给定一个数组A和k,请求出A有多少子数组是`k-优雅子数组`。

子数组是数组中一个或多个连续元素组成的数组。

例如,数组`[1, 2, 3, 4]`包含10个子数组,分别是:`[1]`,`[1, 2]`,`[1, 2, 3]`,`[1, 2, 3, 4]`,`[2]`,`[2, 3]`,`[2, 3, 4]`,`[3]`,`[3, 4]`,`[4]`。

输入描述:

第一行输入两个整数n和k,n是数组A的长度,k是优雅阈值。

第二行输入n个整数,表示给定的数组A。

1 <= n <= 10000, 1 <= k <= n

数组A中的元素A[i]满足:1 <= A[i] <= n

输出描述:

数据一个整数,表示数组A中`k-优雅子数组`的数量

行尾不要有多余空格

补充说明:

 收起

示例1

输入:

7 3
1 2 3 1 2 3 1

输出:

1

说明:

只有子数组[1, 2, 3, 1, 2, 3, 1]是`3-优雅数组`

示例2

输入:

7 2
1 2 3 1 2 3 1

输出:

10

说明:

10个优雅子数组分别是(下标从0计数):

长度为4:[1, 2, 3, 1](下标0~3), [2, 3, 1, 2](下标1~4), [3, 1, 2, 3](下标2~5), [1, 2, 3, 1](下标3~6)

长度为5:[1, 2, 3, 1, 2](下标0~4), [2, 3, 1, 2, 3](下标1~5), [3, 1, 2, 3, 1](下标2~6)

长度为6:[1, 2, 3, 1, 2, 3](下标0~5), [2, 3, 1, 2, 3, 1](下标1~6)

长度为7:[1, 2, 3, 1, 2, 3, 1](下标0~6)

str1 = input()
n,k = int(str1.split(' ')[0]),int(str1.split(' ')[1])
str2 = input()
nums = [int(num) for num in str2.split(' ')]

left, right = 0,0

from collections import defaultdict
cnt_dict = defaultdict(int)

cnt_dict[nums[0]]+=1
max_num = nums[0]
max_cnt = cnt_dict[nums[0]]

res = 0

while right!=n:
   if max_cnt>=k:
      c = 0
      while left<=right:
         if nums[left]!=max_num:
            left+=1
            cnt_dict[nums[left-1]]-=1
            c+=1
         else:
            break
      res += (n-right)*(c+1)

      if right<n-1:
         left += 1
         right += 1
         cnt_dict[nums[left - 1]] -= 1
         cnt_dict[nums[right]] += 1
         if nums[left-1]==max_num:
            max_cnt-=1
      else:
         break
   else:
     if right<n-1:
        right+=1
        cnt_dict[nums[right]]+=1
     else:
        break

   if cnt_dict[nums[right]]>max_cnt:
      max_cnt = cnt_dict[nums[right]]
      max_num = nums[right]
print(res)