给定一个长度为 n
的整数数组 nums
和一个整数 k
。
半重复 子数组是指最多有 k
个元素重复(即出现超过一次)的连续子数组。
返回 nums
中最长 半重复 子数组的长度。
+ +
示例 1:
+ +输入:nums = [1,2,3,1,2,3,4], k = 2
+ +输出:6
+ +解释:
+ +最长的半重复子数组是 [2, 3, 1, 2, 3, 4]
,其中有 2 个重复元素(2 和 3)。
示例 2:
+ +输入:nums = [1,1,1,1,1], k = 4
+ +输出:5
+ +解释:
+ +最长的半重复子数组是 [1, 1, 1, 1, 1]
,其中只有 1 个重复元素(1)。
示例 3:
+ +输入:nums = [1,1,1,1,1], k = 0
+ +输出:1
+ +解释:
+ +最长的半重复子数组是 [1]
,其中没有重复元素。
+ +
提示:
+ +1 <= nums.length <= 105
1 <= nums[i] <= 105
0 <= k <= nums.length
You are given an integer array nums
of length n
and an integer k
.
A semi‑repeating subarray is a contiguous subarray in which at most k
elements repeat (i.e., appear more than once).
Return the length of the longest semi‑repeating subarray in nums
.
+
Example 1:
+ +Input: nums = [1,2,3,1,2,3,4], k = 2
+ +Output: 6
+ +Explanation:
+ +The longest semi-repeating subarray is [2, 3, 1, 2, 3, 4]
, which has two repeating elements (2 and 3).
Example 2:
+ +Input: nums = [1,1,1,1,1], k = 4
+ +Output: 5
+ +Explanation:
+ +The longest semi-repeating subarray is [1, 1, 1, 1, 1]
, which has only one repeating element (1).
Example 3:
+ +Input: nums = [1,1,1,1,1], k = 0
+ +Output: 1
+ +Explanation:
+ +The longest semi-repeating subarray is [1]
, which has no repeating elements.
+
Constraints:
+ +1 <= nums.length <= 105
1 <= nums[i] <= 105
0 <= k <= nums.length
+ + +
FOR TESTING ONLY. WILL BE DELETED LATER.
+// Model solution has runtime of O(n log n), O(n*n) and above should TLE. + ++# Bromelia + +import sys +import random, json, string +import math +import datetime +from collections import defaultdict +ri = random.randint + +MAX_N = 100_000 +MAX_VAL = 100_000 + +def randomString(n, allowed): + return ''.join(random.choices(allowed, k=n)) + +def randomUnique(x, y, n): + return random.sample(range(x, y + 1), n) + +def randomArray(x, y, n): + return [ri(x, y) for _ in range(n)] + +def shuffle(arr): + random.shuffle(arr) + return arr + +def pr(a): + file.write(str(a).replace(" ", "").replace("\'", "\"").replace("\"null\"", "null") + '\n') + +def prstr(a): + pr("\"" + a + "\"") + + +def prtc(tc): + nums, k = tc + pr(nums) + pr(k) + +def examples(): + yield ([1, 2, 3, 1, 2, 3, 4], 2) + yield ([1, 1, 1, 1, 1], 4) + yield ([1, 1, 1, 1, 1], 0) + +def smallCases(): + yield ([MAX_VAL], 0) + yield ([MAX_VAL], 1) + + for len in range(1, 3 + 1): + nums = [0] * len + + def recursiveGenerate(idx: int): + if idx == len: + for k in range(0, len + 1): + yield (nums, k) + else: + for nextElement in range(1, len + 1): + nums[idx] = nextElement + yield from recursiveGenerate(idx + 1) + + yield from recursiveGenerate(0) + +def randomCases(): + params = [ + ( 4, 20, 10, 400), + ( 21, 2000, 1000, 100), + (MAX_N, MAX_N, 10, 2), + (MAX_N, MAX_N, 500, 2), + (MAX_N, MAX_N, MAX_VAL, 2), + ] + for minLen, maxLen, maxVal, testCount in params: + for _ in range(testCount): + len = ri(minLen, maxLen) + k = ri(1, len) + + nums = [0] * len + for i in range(len): + nums[i] = ri(1, maxVal) + + yield (nums, k) + +def cornerCases(): + yield ([MAX_VAL] * MAX_N, 0) + yield ([MAX_VAL] * MAX_N, MAX_N) + yield ([i for i in range(1, MAX_N + 1)], 0) + yield ([i for i in range(1, MAX_N + 1)], MAX_N) + yield ([i // 2 + 1 for i in range(MAX_N)], MAX_N // 2 - 1) + yield ([i % (MAX_N // 2) + 1 for i in range(MAX_N)], MAX_N // 2 - 1) + + +with open('test.txt', 'w') as file: + random.seed(0) + for tc in examples(): prtc(tc) + for tc in smallCases(): prtc(tc) + for tc in sorted(list(randomCases()), key = lambda x: len(x[0])): prtc(tc) + for tc in cornerCases(): prtc(tc) ++