# LeetCode Medium 153. Find Minimum in Rotated Sorted Array
tags: leetcode
問題
前にやったある点を起点にして回転している配列の問題の考え方が利用できそうですね
アイデア
与えられる配列は昇順な配列の一部を回転したものです
真ん中にある値が増加する数列の始点の左側にあるのか右側にあるのかで条件分岐をして, 探索範囲を変えていけばよく, 単調を利用して対数時間で解けます
解法
この問題では降順と成る配列がどこから始まるかを調べます. 下のようにmid
(赤いもの)に対して右側から始まるか, 左側から始まるかで処理を変えます
mid
よりも右から始まる場合- 探索する範囲の始点を
mid + 1
にする
- 探索する範囲の始点を
mid
よりも左から始まる場合- 探索する範囲の終点を
mid
にする
- 探索する範囲の終点を
計算量
配列の長さを$N$とします
- 時間計算量
- $O(\log n)$
- 空間計算量
- $O(1)$
C++
class Solution { public: int findMin(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) { left = mid + 1; } else { right = mid; } } return nums[left]; } };