周賽312。差點以為是單調堆疊之類的東西,結果應該是貪心,要說是dp也可以。

題目

輸入大小為n的整數陣列nums和一個正整數k。

若滿足以下條件,我們將索引i稱為好的

  • k <= i < n - k
  • 索引i左方k個連續元素為非遞增順序
  • 索引i右方k個連續元素為非遞減順序

將所有好的索引依照遞增順序回傳。

解法

一下子遞增遞減有點混淆,不如說要找到索引i為中心,各往左右找k個元素都要是遞增的。
先從左往右掃一次,找到每個位置i左邊有幾個連續遞增元素;再從右往左掃,找到i右邊有幾個遞增元素。
再來遍歷第三次,入果i的左右各有k個以上的遞增元素,則加入答案。

時間複雜度O(N),空間複雜度O(N)。

class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:
        N=len(nums)
        lb=[0]*N
        rb=[0]*N
        ans=[]
        
        last=-inf
        cnt=0
        for i,n in enumerate(nums):
            lb[i]=cnt
            if n>last:
                cnt=1
            else:
                cnt+=1
            last=n
        
        last=-inf
        cnt=0
        for i in range(N-1,-1,-1):
            n=nums[i]
            rb[i]=cnt
            if n>last:
                cnt=1
            else:
                cnt+=1
            last=n
            
        for i in range(N):
            if lb[i]>=k and rb[i]>=k:
                ans.append(i)
                
        return ans