Given an integer array nums and an integer k, return the number of good subarrays of nums.
A subarray arr is good if there are at least k pairs of indices (i, j) such that i < j and arr[i] == arr[j].
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,1,1,1,1], k = 10
Output: 1
Explanation: The only good subarray is the array nums itself.
Example 2:
Input: nums = [3,1,4,3,2,2,4], k = 2
Output: 4
Explanation: There are 4 different good subarrays:
Constraints:
1 <= nums.length <= 105
1 <= nums[i], k <= 109
내 코드
// nums의 좋은 부분 배열 개수 반환
// 부분 배열 arr = 인덱스 쌍(i,j)이 k개. i < j. arr[i] == arr[j]
// 부분 배열 = 배열내 비어있지 않고 연속된 요소 시퀀스
class Solution {
public long countGood(int[] nums, int k) {
int n = nums.length;
int pair = 2;
int[][] arr = new int[pair][n];
int counts = 0;
// k쌍 이상의 부분 배열을 구한다.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[0][n] = nums[i];
arr[1][n] = nums[j];
if (nums[i] < nums[j] && arr[i] == arr[j]) {
counts++;
}
}
}
return counts;
}
}
—
접근
Int n = nums.length;
Int same = 0, right = -1;
HashMap<Integer, Integer> cnt = new HashMap<>();
Long answer = 0;
For (int left = 0; left < n; ++left)
{
while(same < k && right + 1 < n)
{
++right;
Same += cnt.getOrDefault(nums[right], 0;
cnt.put(nums[right],
cnt.getOrDefault(nums[right], 0) + 1);
}
if(same >= k) {
and += n - right;
}
cnt.put(nums[left],
cnt.get(nums[left]) - 1);
same -= cnt.get(nums[left]);
}
return and;
}
}