알고리즘

릿코드 2962. Count Subarrays Where Max Element Appears at Least K Times 코틀린

rkrkrr0101 2024. 3. 29. 09:28

배열의 최대숫자가 k보다 크면 res+1
그냥 0부터 right까지 돌리면서,배열맥스갯수가 k보다 크면 left1씩 줄여가면서 만족하지않을때까지 res+1
타임아웃나니까 뒤에 내부반복문을 제거하고 해당위치값만큼을 저장해둔뒤 그걸 더하는식으로 해결

 

타임아웃

class Solution {
    fun countSubarrays(nums: IntArray, k: Int): Long {
        var res:Long=0
        val numMax = nums.max()
        var subMax=0
        for (i in nums.indices){
            if (nums[i]==numMax){
                subMax+=1
            }
            if (subMax>=k){
                res+=1
                var tempMax=subMax
                for (j in 0 .. i){
                    if (nums[j]==numMax){
                        tempMax-=1
                    }
                    if (tempMax>=k){
                        res+=1
                    }
                }
            }
        }
        return res

    }
}

정답

class Solution {
    fun countSubarrays(nums: IntArray, k: Int): Long {
        var res:Long=0
        val numMax = nums.max()
        var subMax=0
        val maxIndexList = mutableListOf<Int>()
        for (i in nums.indices){
            if (nums[i]==numMax){
                subMax+=1
                maxIndexList.add(i)
            }
            if (subMax>=k){
                res+=1
                if (subMax==k){
                    res+=maxIndexList[0]
                }else{
                    res+=maxIndexList[subMax-k]
                }

            }
        }
        return res

    }
}