[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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바