---
# System prepended metadata

title: 2420\. Find All Good Indices

---

# 2420\. Find All Good Indices

https://leetcode.com/problems/find-all-good-indices/discuss/2624427/Keep-the-index-of-last-bad-relationship-and-utilize-the-symmetry.

```python=
"""
TLE
"""

def non_increasing(li, k):
    for i in range(1,k):  # len(li) will be same as k
        if li[i-1] < li[i]:
            return False
    return True
    
def non_decreasing(li, k):
    for i in range(1,k):  # len(li) will be same as k
        if li[i-1] > li[i]:
            return False
    return True

class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        if n <= 2 * k:
            return []
        
        ans = []
        for i in  range(k, n - k):
            if non_increasing(nums[i - k:i], k) and non_decreasing(nums[i + 1:i + 1 + k], k):
                ans.append(i)
                
        return ans 

#############################################################################################
    
class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        
        # previous k non-increasing
        last_idx_larger_than_prev = None  # Record last i such that nums[i-1] < nums[i]
        previous_k_non_incr = [True] * n
        for i in range(n):
            if i == 0:
                continue
            
            # If the bad relationship (nums[i-1]<nums[i]) is too near,
            # it fails to meet:
            # "The k elements that are just before the index i are in non-increasing order."
            if last_idx_larger_than_prev is not None \
            and last_idx_larger_than_prev >= i - k + 1:
                previous_k_non_incr[i] = False 
            
            # Update the idx of nearest bad relationship (nums[i-1]<nums[i])
            if nums[i-1] < nums[i]:
                last_idx_larger_than_prev = i
                
                
        # Use the symmetry.
        # If we horizontally flip the "previous k non-increasing" of nums[::-1],
        # we can get "posterior k non-increasing" of nums.
        rev_nums = nums[::-1]
        last_idx_larger_than_prev = -1  # Record last i such that nums[i-1] < nums[i]
        tmp_posterior_k_non_decr = [True] * n
        for i in range(n):
            if i == 0:
                continue
                
            if last_idx_larger_than_prev >= i - k + 1:
                tmp_posterior_k_non_decr[i] = False
            
            if rev_nums[i-1] < rev_nums[i]:
                last_idx_larger_than_prev = i
                
        posterior_k_non_decr = tmp_posterior_k_non_decr[::-1]
        
            
        ans = []
        for i in  range(k, n - k):
            if posterior_k_non_decr[i] and previous_k_non_incr[i]:
                ans.append(i)
                
        return ans       

#############################################################################################

def get_previous_k_non_incr(n, nums, k):
    # previous k non-increasing
    last_idx_larger_than_prev = None  # Record last i such that nums[i-1] < nums[i]
    previous_k_non_incr = [True] * n
    for i in range(1,n):
        # If the bad relationship (nums[i-1]<nums[i]) is too near,
        # it fails to meet:
        # "The k elements that are just before the index i are in non-increasing order."
        if last_idx_larger_than_prev is not None \
        and last_idx_larger_than_prev >= i - k + 1:
            previous_k_non_incr[i] = False 

        # Update the idx of nearest bad relationship (nums[i-1]<nums[i])
        if nums[i-1] < nums[i]:
            last_idx_larger_than_prev = i
    return previous_k_non_incr

class Solution:
    def goodIndices(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        
        previous_k_non_incr = get_previous_k_non_incr(n, nums, k)
        posterior_k_non_decr = get_previous_k_non_incr(n, nums[::-1], k)[::-1]
            
        ans = []
        for i in  range(k, n - k):
            if posterior_k_non_decr[i] and previous_k_non_incr[i]:
                ans.append(i)
                
        return ans       
            
        
```