랜덤 플립 매트릭스

2004 단어 theabbieleetcodedsa
m x n 이진 그리드matrix가 있으며 초기에 모든 값이 설정0되어 있습니다. (i, j)에서 인덱스 matrix[i][j] == 0를 임의로 선택하고 1로 뒤집는 알고리즘을 설계합니다. (i, j)가 반환될 가능성이 동일한 모든 인덱스matrix[i][j] == 0.

알고리즘을 최적화하여 언어의 내장 임의 함수에 대한 호출 수를 최소화하고 시간 및 공간 복잡성을 최적화합니다.
Solution 클래스를 구현합니다.
  • Solution(int m, int n) 이진 행렬 mn 크기로 객체를 초기화합니다.
  • int[] flip() [i, j] 행렬의 임의 인덱스matrix[i][j] == 0를 반환하고 이를 1로 뒤집습니다.
  • void reset() 행렬의 모든 값을 0로 재설정합니다.

  • 예 1:

    입력
    ["솔루션", "뒤집기", "뒤집기", "뒤집기", "재설정", "뒤집기"]
    [[3, 1], [], [], [], [], []]
    산출
    [널, [1, 0], [2, 0], [0, 0], 널, [2, 0]]

    설명
    솔루션 솔루션 = 새로운 솔루션(3, 1);
    솔루션.플립();//return [1, 0], [0,0], [1,0], [2,0]은 같은 확률로 반환되어야 합니다.
    솔루션.플립();//[2,0]을 반환합니다. [1,0]이 반환되었으므로 [2,0]과 [0,0]
    솔루션.플립();//return [0, 0], 이전에 반환된 인덱스를 기준으로 [0,0]만 반환 가능.
    솔루션.리셋();//모든 값은 0으로 재설정되며 반환될 수 있습니다.
    솔루션.플립();//return [2, 0], [0,0], [1,0], [2,0]은 같은 확률로 반환되어야 합니다.

    제약:
  • 1 <= m, n <= 104
  • flip에 대한 각 호출에 대해 사용 가능한 셀이 하나 이상 있습니다.
  • 최대 1000 호출이 flipreset 로 이루어집니다.

  • 해결책:

    from random import randint
    
    class Solution:
    
        def __init__(self, m: int, n: int):
            self.m = m
            self.n = n
            self.ones = set()
    
        def flip(self) -> List[int]:
            i, j = randint(0, self.m - 1), randint(0, self.n - 1)
            while (i, j) in self.ones:
                i, j = randint(0, self.m - 1), randint(0, self.n - 1)
            self.ones.add((i, j))
            return [i, j]
    
        def reset(self) -> None:
            self.ones.clear()
    
    # Your Solution object will be instantiated and called as such:
    # obj = Solution(m, n)
    # param_1 = obj.flip()
    # obj.reset()
    

    좋은 웹페이지 즐겨찾기