Algorithm/Leetcode
[Java] LeetCode 2444. Count Subarrays With Fixed Bounds
junz
2023. 3. 4. 16:57
728x90
반응형
[Java] LeetCode 2444. Count Subarrays With Fixed Bounds
문 제 :
일차원 배열 nums가 주어진다.
정수 minK, maxK가 주어진다.
nums의 부분 배열 중 최소값이 minK이고, 최대값이 maxK인 부분배열의 개수를 구해라.
Constraint
{ 2 <= nums.length <= 10^5 }
{ 1 <= nums[i], minK, maxK <= 10^6 }
Example )
Input: nums = [1,3,5,2,7,5], minK = 1, maxK = 5
Output: 2
Explanation:
The fixed-bound subarrays are [1,3,5] and [1,3,5,2].
//////////////////////////////////////////////////////////
Input: nums = [1,1,1,1], minK = 1, maxK = 1
Output: 10
Explanation:
Every subarray of nums is a fixed-bound subarray. There are 10 possible subarrays.
접 근 :
Two Pointer 로 접근했다.
해 결 :
반복문으로 배열을 돌면서 minK, maxK의 값을 벗어난 값의 인덱스를 구한다. (j라고 하자)
maxK의 인덱스를 구한다. (prevMaxIndex)
minK의 인덱스를 구한다. (prevMinIndex)
범위안에 들면서 maxK나 minK의 값을 가지는 인덱스 중 작은 인덱스를 기준으로 j만큼 뺀 값을 카운팅해준다.
이 의미는 범위가 벗어나기 직전까지의 subArray의 개수를 세주는 것이다. 그래서 범위가 벗어나는 부분의 인덱스를 저장하고 있다가, 조건을 만족하는 subArray가 중간에서 나타나게 되면 그 만큼의 개수를 세줄 수 있는 것이다.
결 과 :
class Solution {
public long countSubarrays(int[] nums, int minK, int maxK) {
long cnt=0;
int prevMinIndex = -1;
int prevMaxIndex = -1;
int j = -1;
for(int i=0; i<nums.length; i++){
if(minK > nums[i] || maxK < nums[i])
j = i;
if(maxK == nums[i])
prevMaxIndex = i;
if(minK == nums[i])
prevMinIndex = i;
cnt += Math.max(0, Math.min(prevMaxIndex, prevMinIndex) - j);
}
return cnt;
}
}
728x90
반응형