[리트코드] 153 -  Find Minimum in Rotated Sorted Array(Java)

2025. 7. 28. 02:22·알고리즘

문제 설명

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/

Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:

  • [4,5,6,7,0,1,2] if it was rotated 4 times.
  • [0,1,2,4,5,6,7] if it was rotated 7 times.

Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]] 1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]].

Given the sorted rotated array nums of unique elements, return the minimum element of this array.

You must write an algorithm that runs in O(log n) time.


🔍 접근법

이 문제의 핵심은 배열이 정렬된 상태에서 회전되었다는 점에 있다.

즉, 다음과 같은 특성이 있다:

  • 회전되었으므로 배열은 두 개의 오름차순 정렬된 구간으로 나뉘게 된다.
  • 최솟값은 항상 두 구간의 경계 지점에 위치한다.
  • 배열의 끝 값(nums[end])은 중요한 기준점 역할을 한다.

이를 기반으로 이진 탐색을 적용할 수 있다.


💻 코드

class Solution {
    public int findMin(int[] nums) {
        int start = 0;
        int end = nums.length-1;
        int mid = 0;

        while(start < end){
             mid = start + (end - start)/2;
                
            if(nums[mid] < nums[end]){ //mid 지점이 현재 min의 왼쪽 영역에 위치
                end = mid;    
            }else{ //mid 지점이 현재 min의 오른쪽 영역에 위치
                start = mid + 1;
            }
        }
        return nums[start];
    }
}

nums[mid] < nums[end]일 경우 mid가 최솟값일 가능성이 있으므로 end = mid로 설정해 탐색 구간에 포함시키지만, nums[mid] > nums[end]일 경우 mid는 회전된 배열의 왼쪽 정렬 구간에 있어 최솟값이 될 수 없으므로 start = mid + 1로 설정해 탐색에서 제외합니다. 이는 이분 탐색의 종료 조건인 start == end를 만족시킬 때, 최솟값이 정확히 한 지점에 수렴하도록 보장하는 방식입니다.


💡 정리

  • 이진 탐색의 종료 조건은 start == end, 즉 후보가 하나만 남을 때다.
  • 탐색 범위를 줄일 때 mid가 최소값일 수 있는 경우에는 end = mid로 포함시키고, 최소값이 될 수 없는 경우는 start = mid + 1로 제외시켜 왔다.
  • 이 과정을 반복하면서 start ~ end 범위에는 항상 최소값이 포함되어 있었고, 결국 단 하나의 값으로 수렴된다.
  • 따라서 이 시점에서 nums[start] == nums[end]는 반드시 최소값이 되며, 두 값은 같기 때문에 아무 쪽을 리턴해도 된다.

'알고리즘' 카테고리의 다른 글

[BOJ] 11724 - 연결 요소의 개수(Java)  (0) 2025.08.01
[BOJ] 2667 - 단지번호붙이기(Java)  (3) 2025.08.01
[리트코드] 162 - Find Peak Element(Java)  (0) 2025.07.26
[BOJ] 1541 - 잃어버린 괄호(Java)  (0) 2025.07.09
[프로그래머스] 괄호 회전하기(Java)  (2) 2025.07.05
'알고리즘' 카테고리의 다른 글
  • [BOJ] 11724 - 연결 요소의 개수(Java)
  • [BOJ] 2667 - 단지번호붙이기(Java)
  • [리트코드] 162 - Find Peak Element(Java)
  • [BOJ] 1541 - 잃어버린 괄호(Java)
dev-hun
dev-hun
스스로 학습한 내용을 정리하는 공간입니다.
  • dev-hun
    훈심's IT Blog
    dev-hun
  • 전체
    오늘
    어제
    • 분류 전체보기 (17)
      • 알고리즘 (14)
      • 트러블 슈팅 (1)
      • TIL (1)
      • 자료구조 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    StringTokenizer
    StringBuilder
    리트코드
    괄호 회전하기
    잃어버린 괄호
    알고리즘
    greedy
    java
    DFS
    백준
    HashSet
    프로그래머스
    Spring Boot
    우선순위 큐
    NGINX
    누적합
    이분 탐색
    swagger
    그리디
    예상대진표
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
dev-hun
[리트코드] 153 -  Find Minimum in Rotated Sorted Array(Java)
상단으로

티스토리툴바