Neunomizuの日記

俺だけが俺だけじゃない

# LeetCode Medium 153. Find Minimum in Rotated Sorted Array

tags: leetcode

問題

前にやったある点を起点にして回転している配列の問題の考え方が利用できそうですね

イデア

与えられる配列は昇順な配列の一部を回転したものです

真ん中にある値が増加する数列の始点の左側にあるのか右側にあるのかで条件分岐をして, 探索範囲を変えていけばよく, 単調を利用して対数時間で解けます

解法

この問題では降順と成る配列がどこから始まるかを調べます. 下のようにmid(赤いもの)に対して右側から始まるか, 左側から始まるかで処理を変えます

  1. midよりも右から始まる場合
    • 探索する範囲の始点をmid + 1にする
  2. 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];
  }
};