Skip to content

153. Find Minimum in Rotated Sorted Array#40

Open
5103246 wants to merge 1 commit intomainfrom
153-find-minimum-in-rotated-sorted-array
Open

153. Find Minimum in Rotated Sorted Array#40
5103246 wants to merge 1 commit intomainfrom
153-find-minimum-in-rotated-sorted-array

Conversation

@5103246
Copy link
Copy Markdown
Owner

@5103246 5103246 commented Feb 25, 2026

Comment on lines +18 to +20
- leftより左側はtarget以上、rightを含む右側はtarget以上
- middleの要素がtarget以上ならleftをmiddle+1に更新し、要素がtarget未満ならtargetを更新し、rightをmiddleにする。
- left == rightがループの終了条件
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leftより左側はtarget以上、rightを含む右側はtarget以上

left == rightがループの終了条件

であれば、ループを抜けたとき nums[right] == min_target なので、ループ内で都度更新する手間が省けますね (step2).

Comment on lines +88 to +90
- leftより左は最小値よりも大きく、rightを含む右側は最小値以上になる。なので探索終了時のleft, rightが最小値となる。
- 最後尾の要素よりmiddleが大きい場合、middleを含む左側には最小値がないことがわかるのでleftをmiddle + 1にする。
- middleが右端以下なら、昇順に並んでいることから、middleを含む左側に最小値があることがわかる。なので、rightをmiddleに更新する。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[fyi]
自分は、left より左 とか、right を含む右側は、という含む・含まないの境界や、ループ終了条件と最終的にどこを返すのか、というのがなかなか頭の中で整理できないのですが、「nums.back()以下か?」のtrue,falseの境界を求めるのだと考えたら分かりやすかったです。

class Solution {
public:
    int findMin(const vector<int>& nums) {
        int ng = -1;
        int ok = nums.size();

        while (ng + 1 < ok) {
            int middle = ng + (ok - ng) / 2;

            if (nums[middle] <= nums.back()) {
                ok = middle;
            } else {
                ng = middle;
            }
        }

        return nums[ok];
    }
};

参考:https://qiita.com/drken/items/97e37dd6143e33a64c8c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants