[LeetCode] 33. Search in Rotated Sorted Array.

2023. 8. 8. 22:40·Problem Solving/LeetCode

https://leetcode.com/problems/search-in-rotated-sorted-array/

 

Search in Rotated Sorted Array - LeetCode

Can you solve this real interview question? Search in Rotated Sorted Array - There is an integer array nums sorted in ascending order (with distinct values). Prior to being passed to your function, nums is possibly rotated at an unknown pivot index k (1 <=

leetcode.com

 

이분탐색을 활용한 문제. 

보통 (lo + hi) // 2로 mid값을 갱신해주는데, lo + (hi - lo) // 2라는 코드를 발견했다. 찾아보니 오버플로우를 방지하기 위한 연산이다. 예를 들어 lo = 3, hi = 2,147,483,647 라고 생각해보자. (3 + 2,147,483,647) // 2 를 연산하면 hi는 int 값의 범위의 max에 해당하기 때문에 오버플로우가 발생한다. 즉, 3 + 2,147,483,647 = -3이 되어 최종적인 계산에서는 -3 // 2 가 수행된다. 이를 방지하기 위해 lo + (hi - lo) // 2를 사용한다. 계산하게 되면 3 + (2,147,483,647 - 3) // 2 = 1,023,.... 어쩌구저쩌구가 나온다. 오늘도 하나 배웠다 !

class Solution:
    def search(self, nums, target):
        if not nums:
            return -1
        low, high = 0, len(nums) - 1
        while low <= high:
            mid = low + (high - low) // 2
            if target == nums[mid]:
                return mid

            # mid가 nums[low]보다 큰 경우에는 오름차순 정렬이 되어있다. 
            # 즉, 어떤 pivot을 기준으로 rotate가 되지 않은 상태임을 뜻한다. 
            
            if nums[low] <= nums[mid]: # low ~ mid는 정렬되어 있는 상태 

                # target이 범위 내에 존재한다면 high범위를 mid - 1로 조절한다.
                if nums[low] <= target <= nums[mid]:
                    high = mid - 1
                # 그렇지 않다면 low값을 조절한다. 
                else:
                    low = mid + 1

            # nums[mid]가 low보다 작다면 해당 값은 어떤 pivot에 의해 
            # rotate가 된 배열의 값 중 하나임을 뜻한다.

            else: # mid ~ high가 정렬되어 있는 상태 
                if nums[mid] <= target <= nums[high]: 
                    low = mid + 1
                else:
                    high = mid - 1

        return -1

 

 

'Problem Solving/LeetCode' 카테고리의 다른 글
  • [LeetCode] 49. Group Anagrams
  • [LeetCode] 2811. Check if it is Possible to Split Array
  • [LeetCode] 88. Merge Sorted Array
  • [LeetCode] 83. Remove Duplicates from Sorted List
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    CORS
    Bucket
    TypeScript
    점 업데이트
    삼성기출
    도커
    파이썬
    interface
    인터페이스
    PrefixSum
    docker
    구간합
    imos법
    docker image
    온라인 쿼리
    컨테이너
    S3
    백준
    python
    AWS
    구간 업데이트
    누적합
    오블완
    알고리즘
    세그먼트 트리
    인덱서블 타입
    segment tree
    오프라인 쿼리
    인덱스 시그니처
    타입스크립트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[LeetCode] 33. Search in Rotated Sorted Array.
상단으로

티스토리툴바