LeetCode 면접 문제 16.16 부분 정렬

1. 제목
원제 링크
https://leetcode-cn.com/problems/sub-sort-lcci/
제목 설명
정수 배열 을 지정 하고 함 수 를 작성 하여 색인 m 와 n 을 찾 습 니 다. 색인 구간 [m, n] 의 요 소 를 정렬 하면 전체 배열 이 질서 가 있 습 니 다.주의: n - m 는 가능 한 한 최소 화 합 니 다. 즉, 조건 에 맞 는 최 단 서열 을 찾 는 것 입 니 다.함수 반환 값 은 [m, n] 입 니 다. 이러한 m 와 n 이 존재 하지 않 는 다 면 [- 1, - 1] 을 되 돌려 주 십시오.
예시
예시 1
입력: [1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19] 출력: [3, 9]
2. 알고리즘
방법 1 직접 정렬
사고의 방향
배열 을 정렬 하여 원본 배열 과 비교 합 니 다.
알고리즘
  • 두 개의 지침 i, j i, j i, j 를 정의 하고 0, n - 1 0, n - 1 0, n - 1 로 초기 화 합 니 다.원래 의 배열 은 n u m s 1 nums 1 nums 1 이 고 정렬 된 배열 은 n u m s 2 nums 2 nums 2
  • 이다.
  • i i 포인터 가 왼쪽 에서 오른쪽으로 옮 겨 다 니 며 n u m s 1 [i] 를 처음 만 날 때 까지! =n u m s 2 [ i ] nums1[i] != nums2[i] nums1[i]!=nums2 [i], 이때 i i 를 기록 하고 순환 종료
  • j j 지침 이 같다.

  • 코드
    class Solution:
        def subSort(self, array):
            result = [-1, -1]
            sorted_array = sorted(array)
            n = len(array)
            for i in range(n):
                if sorted_array[i] != array[i]:
                    result[0] = i
                    break
            for j in range(n - 1, -1, -1):
                if sorted_array[j] != array[j]:
                    result[1] = j
                    break
            return result
    

    복잡 도
  • 시간 복잡 도: O (N l o g N) O (NlogN) O (NlogN)
  • 공간 복잡 도: O (N) O (N) O (N)
  • 방법 2 번 옮 겨 다 니 기
    사고의 방향
    만약 에 왼쪽 의 최대 치가 중간의 최소 치보다 크 면 반드시 중간 서열 에 포 함 될 것 이다.마찬가지 로 오른쪽 최소 치가 중간의 최대 치보다 크 면 반드시 중간 서열 에 포 함 될 것 이다.
    알고리즘
  • 이전에 배열 을 뒤로 스 캔 하여 현재 a r a y [i] array [i] array [i] array [i] 가 m a x max max 보다 작 은 지 판단 하고 l a s t last last 를 현재 a r a y array array 아래 에 i i i 를 표시 하 는 지 판단 합 니 다. 그렇지 않 으 면 m a x max max max 를 업데이트 합 니 다.
  • 뒤에서 배열 을 스 캔 하여 현재 a r a y [l e n - 1 - i] array [len - 1 - i] array [len - 1 - i] 가 m i n min 보다 큰 지 판단 하고 f i r s t first 를 현재 아래 표 시 된 l e n - 1 - i len - 1 - i len - 1 - i len - 1 - i - i 보다 큰 지 판단 한다. 그렇지 않 으 면 m i n min min 을 업데이트 한다.
  • [f i r s t, l a s t] [first, last] [first, last]
  • 코드
    class Solution:
        def subSort(self, array):
            n = len(array)
            if n == 0:
                return [-1, -1]
            l, r = -1, -1
            max_val, min_val = array[0], array[-1]
            for i in range(n):
                if array[i] >= max_val:
                    max_val = array[i]
                else:
                    r = i
            for j in range(n - 1, -1, -1):
                if array[j] <= min_val:
                    min_val = array[j]
                else:
                    l = j
            return [l, r]
    

    복잡 도
  • 시간 복잡 도: O (N) O (N) O (N)
  • 공간 복잡 도: O (1) O (1) O (1)
  • 좋은 웹페이지 즐겨찾기