From c8b7cbc6bdc47d9afbd361209c0c01de2441b85c Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Fri, 15 Nov 2024 08:11:11 +0900 Subject: [PATCH 01/12] Step 1 --- .../find-minimum-in-rotated-sorted-array.md | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md new file mode 100644 index 0000000..1ae71ec --- /dev/null +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -0,0 +1,47 @@ +# 153. Find Minimum in Rotated Sorted Array + +LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/ + +この問題は Java で解いています。 +各解法において、メソッドが属するクラスとして `Solution` を定義していますが、これは Java の言語仕様に従い、コードを実行可能にするために必要なものです。このクラス自体には特定の意味はなく、単にメソッドを組織化し、実行可能にするためのものです。 + +## Step 1 + +答えは知っていたのですぐ書けたが、充分に理解出来ているのかと言われると自信がないので、頭の中の整理を兼ねて何をしているのか書き出してみる。 + +- 2つのポインタを保持しながら二分探索を行う + - left: これが指す位置よりも左には最小の値がないことを示す + - right: これが指す位置よりも右には最小の値がないことを示す +- 各イテレーションで探索範囲の中央にある値を確認し、 + - 次のどちらかの処理を行う: + - right の値と同じかそれよりも小さい場合、right を中央の値の位置に移動させる + - 上の条件に当てはまらない場合、中央の値の位置のひとつ右の位置に left を移動させる + - right を最小の値がある位置に向かわせ、left には最大位置と最小位置の境目を探させるイメージ + +```java +/** + * 時間計算量: O(log n) + * 空間計算量: O(1) + */ +class Solution { + public int findMin(int[] nums) { + int left = 0, right = nums.length - 1; + while (left < right) { + int middle = left + (right - left) / 2; + if (nums[middle] <= nums[right]) { + right = middle; + } else { + left = middle + 1; + } + } + return nums[right]; + } +} +``` + +left, right は配列内での位置関係に合わせて命名しているが、もっと具体的な役割を表すような名前にしてもいいかもと思った + +- しかしいい名前が思いつかない + - left: rotationBoundary + - right: minValue +- 最初に変数名だけ見てもわからなさそうなので、やはり left, right ぐらいにしておくのがいいか From dacfa195ffd257dab1c24d4157a79ab6cef4caae Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Fri, 15 Nov 2024 08:12:56 +0900 Subject: [PATCH 02/12] fix a bit --- arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 1ae71ec..274fd24 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -9,7 +9,7 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array 答えは知っていたのですぐ書けたが、充分に理解出来ているのかと言われると自信がないので、頭の中の整理を兼ねて何をしているのか書き出してみる。 -- 2つのポインタを保持しながら二分探索を行う +- 2つのポインタを保持しながら二分探索を行い、最小の値がある位置を特定する - left: これが指す位置よりも左には最小の値がないことを示す - right: これが指す位置よりも右には最小の値がないことを示す - 各イテレーションで探索範囲の中央にある値を確認し、 From 0403a03cb7ca9c0bc69e363badadbf66a7222a6b Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Fri, 15 Nov 2024 08:33:11 +0900 Subject: [PATCH 03/12] fix --- arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 274fd24..f9cc1e2 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -43,5 +43,5 @@ left, right は配列内での位置関係に合わせて命名しているが - しかしいい名前が思いつかない - left: rotationBoundary - - right: minValue + - right: minValueExplorer - 最初に変数名だけ見てもわからなさそうなので、やはり left, right ぐらいにしておくのがいいか From 339b45386d78b2498b2b67f0563fe15900104043 Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Fri, 15 Nov 2024 08:51:33 +0900 Subject: [PATCH 04/12] step 2 --- .../find-minimum-in-rotated-sorted-array.md | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index f9cc1e2..de5a5f3 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -45,3 +45,38 @@ left, right は配列内での位置関係に合わせて命名しているが - left: rotationBoundary - right: minValueExplorer - 最初に変数名だけ見てもわからなさそうなので、やはり left, right ぐらいにしておくのがいいか + +## Step 2 + +### 最小の値を左端に持つ範囲を探索するアプローチ + +最小の値そのものでなく、それを左端に持つ範囲を探索する。 + +各イテレーションでは left を最大位置と最小位置の境目に移動させることを目的とした処理が行われる。right はその際行われる二分探索処理に必要。 + +While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装した。 + +```java +/** + * 時間計算量: O(log n) + * 空間計算量: O(1) + */ +class Solution { + public int findMin(int[] nums) { + int left = 0, right = nums.length - 1; + while (left <= right) { + if (nums[left] <= nums[right]) { + return nums[left]; + } + + int middle = left + (right - left) / 2; + if (nums[left] <= nums[middle]) { + left = middle + 1; + } else { + right = middle; + } + } + throw new IllegalArgumentException("Unreachable if the argument is valid"); + } +} +``` From 1d716273369558da04e7e71267d5b50e71d59c5c Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 06:42:25 +0900 Subject: [PATCH 05/12] fix --- .../find-minimum-in-rotated-sorted-array.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index de5a5f3..fbdd696 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -12,9 +12,9 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array - 2つのポインタを保持しながら二分探索を行い、最小の値がある位置を特定する - left: これが指す位置よりも左には最小の値がないことを示す - right: これが指す位置よりも右には最小の値がないことを示す -- 各イテレーションで探索範囲の中央にある値を確認し、 - - 次のどちらかの処理を行う: - - right の値と同じかそれよりも小さい場合、right を中央の値の位置に移動させる +- 各イテレーションで: + - 探索範囲の中央にある値を確認し、次のどちらかの処理を行う: + - right の値よりも小さい場合、right を中央の値の位置に移動させる - 上の条件に当てはまらない場合、中央の値の位置のひとつ右の位置に left を移動させる - right を最小の値がある位置に向かわせ、left には最大位置と最小位置の境目を探させるイメージ @@ -28,7 +28,7 @@ class Solution { int left = 0, right = nums.length - 1; while (left < right) { int middle = left + (right - left) / 2; - if (nums[middle] <= nums[right]) { + if (nums[middle] < nums[right]) { right = middle; } else { left = middle + 1; @@ -50,11 +50,10 @@ left, right は配列内での位置関係に合わせて命名しているが ### 最小の値を左端に持つ範囲を探索するアプローチ -最小の値そのものでなく、それを左端に持つ範囲を探索する。 - +最小の値そのものでなく、それを左端に持つ範囲を探索する。 各イテレーションでは left を最大位置と最小位置の境目に移動させることを目的とした処理が行われる。right はその際行われる二分探索処理に必要。 -While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装した。 +While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装してみた。 ```java /** From 7dffa1ea30de1b8a9c5b8e09e9b94af65a9f243a Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 06:49:09 +0900 Subject: [PATCH 06/12] fix --- .../Binary_Search/find-minimum-in-rotated-sorted-array.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index fbdd696..4a41d7c 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -13,9 +13,9 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array - left: これが指す位置よりも左には最小の値がないことを示す - right: これが指す位置よりも右には最小の値がないことを示す - 各イテレーションで: - - 探索範囲の中央にある値を確認し、次のどちらかの処理を行う: - - right の値よりも小さい場合、right を中央の値の位置に移動させる - - 上の条件に当てはまらない場合、中央の値の位置のひとつ右の位置に left を移動させる + - 探索範囲の中央にある値 (以下 middle) を確認し、次のどちらかの処理を行う: + - middle が right の値よりも小さい場合、最小の値はそこかそれよりも左の位置にあるため、right を中央の値の位置に移動させる + - 上の条件に当てはまらない場合、最小の値はそれよりも右の位置にあるため、middle のひとつ右の位置に left を移動させる - right を最小の値がある位置に向かわせ、left には最大位置と最小位置の境目を探させるイメージ ```java @@ -53,7 +53,7 @@ left, right は配列内での位置関係に合わせて命名しているが 最小の値そのものでなく、それを左端に持つ範囲を探索する。 各イテレーションでは left を最大位置と最小位置の境目に移動させることを目的とした処理が行われる。right はその際行われる二分探索処理に必要。 -While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装してみた。 +While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装してみた。引数がいくつかの条件を満たしている前提で実行されることを想定した関数なので、仕事では Javadoc か何かに問題の constraints にあたるものを仕様として記載しておきたいところ。 ```java /** From 8e7ca39f299bd5fa03b5e6f254a8c6568d7e5b86 Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 08:50:09 +0900 Subject: [PATCH 07/12] fix --- .../find-minimum-in-rotated-sorted-array.md | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 4a41d7c..f47e5e5 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -7,16 +7,13 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array ## Step 1 -答えは知っていたのですぐ書けたが、充分に理解出来ているのかと言われると自信がないので、頭の中の整理を兼ねて何をしているのか書き出してみる。 +答えを知っていたので書けはしたのですが、手癖ではなく充分な理解を持った上で解けているか自信がないので、この解法に対する理解を以下に書き出します。フィードバックいただけますと嬉しいです。 -- 2つのポインタを保持しながら二分探索を行い、最小の値がある位置を特定する - - left: これが指す位置よりも左には最小の値がないことを示す - - right: これが指す位置よりも右には最小の値がないことを示す -- 各イテレーションで: - - 探索範囲の中央にある値 (以下 middle) を確認し、次のどちらかの処理を行う: - - middle が right の値よりも小さい場合、最小の値はそこかそれよりも左の位置にあるため、right を中央の値の位置に移動させる - - 上の条件に当てはまらない場合、最小の値はそれよりも右の位置にあるため、middle のひとつ右の位置に left を移動させる - - right を最小の値がある位置に向かわせ、left には最大位置と最小位置の境目を探させるイメージ +- 閉区間で二分探索を行い、最小の値から始まる範囲とそうでない範囲の境目を探す + - 例えば `[3,4,5,1,2]` の場合、最小の値から始まる範囲に属する値を T 、そうでないものを F とすると `[F, F, F, T, T]` となるが、この T の中で一番左側にあるものを探していくイメージ +- 各イテレーションで探索範囲の中央にある値 (以下 middle) を確認し、次のどちらかの処理を行う: + - middle の位置にある値が right の位置にある値よりも小さい場合、最小の値はそこかそれよりも左の位置にあるため、right を middle の位置に移動させる + - 上の条件に当てはまらない場合、最小の値はそれよりも右の位置にあるため、middle のひとつ右の位置に left を移動させる ```java /** @@ -39,21 +36,34 @@ class Solution { } ``` -left, right は配列内での位置関係に合わせて命名しているが、もっと具体的な役割を表すような名前にしてもいいかもと思った +## Step 2 -- しかしいい名前が思いつかない - - left: rotationBoundary - - right: minValueExplorer -- 最初に変数名だけ見てもわからなさそうなので、やはり left, right ぐらいにしておくのがいいか +### 右端の値を用いて比較を行うパターン (半開区間) -## Step 2 +何人か他の方が書かれていたので書いてみました。 +右端の値が、最小の値かそれよりも右にあるいずれかの値であることを利用した条件判定により二分探索を行います。 -### 最小の値を左端に持つ範囲を探索するアプローチ +```java +class Solution { + public int findMin(int[] nums) { + int left = 0, right = nums.length; + while (left < right) { + int middle = left + (right - left) / 2; + if (nums[middle] <= nums[nums.length - 1]) { + right = middle; + } else { + left = middle + 1; + } + } + return nums[left]; + } +} +``` -最小の値そのものでなく、それを左端に持つ範囲を探索する。 -各イテレーションでは left を最大位置と最小位置の境目に移動させることを目的とした処理が行われる。right はその際行われる二分探索処理に必要。 +### While 文終了前に return させるパターン -While 文の中で範囲が見つかったかどうか判定させた方がコードの見通しが良くなると考え、引数が valid であればこれの外の範囲には出ないことを前提に実装してみた。引数がいくつかの条件を満たしている前提で実行されることを想定した関数なので、仕事では Javadoc か何かに問題の constraints にあたるものを仕様として記載しておきたいところ。 +Step 1 の解法の処理効率向上のため、最小の値が存在する位置が見つかったらその時点で return させるよう修正します。 +While 文の外の範囲には出ないことを前提に実装してますが、仕事では Javadoc か何かに問題の constraints にあたるものを仕様として記載しておきたい気持ちがあります。 ```java /** From a60445315f530ea03b061860ab6468bb75c6ecea Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 09:00:00 +0900 Subject: [PATCH 08/12] step 3 --- .../find-minimum-in-rotated-sorted-array.md | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index f47e5e5..048f6c6 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -62,8 +62,7 @@ class Solution { ### While 文終了前に return させるパターン -Step 1 の解法の処理効率向上のため、最小の値が存在する位置が見つかったらその時点で return させるよう修正します。 -While 文の外の範囲には出ないことを前提に実装してますが、仕事では Javadoc か何かに問題の constraints にあたるものを仕様として記載しておきたい気持ちがあります。 +Step 1 の解法の処理効率向上のため、最小の値が存在する位置が見つかったらその時点で return させるよう修正します。 ```java /** @@ -73,19 +72,49 @@ While 文の外の範囲には出ないことを前提に実装してますが class Solution { public int findMin(int[] nums) { int left = 0, right = nums.length - 1; - while (left <= right) { - if (nums[left] <= nums[right]) { + while (left < right) { + if (nums[left] < nums[right]) { return nums[left]; } int middle = left + (right - left) / 2; - if (nums[left] <= nums[middle]) { - left = middle + 1; + if (nums[middle] <= nums[right]) { + right = middle; } else { + left = middle + 1; + } + } + return nums[left]; + } +} +``` + +## Step 3 + +処理効率の良さでこちらを選びました。 +好みかもしれませんが、右端の値を用いて比較を行うパターン (半開区間) よりも直感的にも思えます。 + +```java +/** + * 時間計算量: O(log n) + * 空間計算量: O(1) + */ +class Solution { + public int findMin(int[] nums) { + int left = 0, right = nums.length - 1; + while (left < right) { + if (nums[left] < nums[right]) { + return nums[left]; + } + + int middle = left + (right - left) / 2; + if (nums[middle] <= nums[right]) { right = middle; + } else { + left = middle + 1; } } - throw new IllegalArgumentException("Unreachable if the argument is valid"); + return nums[left]; } } ``` From cd908f56786aaa3b72fa5324e1c07bff7f1e72b0 Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 15:15:23 +0900 Subject: [PATCH 09/12] fix --- .../find-minimum-in-rotated-sorted-array.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 048f6c6..0e9e0a4 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -14,6 +14,9 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array - 各イテレーションで探索範囲の中央にある値 (以下 middle) を確認し、次のどちらかの処理を行う: - middle の位置にある値が right の位置にある値よりも小さい場合、最小の値はそこかそれよりも左の位置にあるため、right を middle の位置に移動させる - 上の条件に当てはまらない場合、最小の値はそれよりも右の位置にあるため、middle のひとつ右の位置に left を移動させる +- 各ポインタは以下示しているため、同じ位置を指したら即ちその位置に存在する値が最小の値であると判断する: + - left: これが指す位置よりも左には最小の値が存在しないことを示す + - right: これが指す位置にある値が、最小の値かそれよりも右に存在するものであることを示す ```java /** @@ -25,20 +28,20 @@ class Solution { int left = 0, right = nums.length - 1; while (left < right) { int middle = left + (right - left) / 2; - if (nums[middle] < nums[right]) { + if (nums[middle] <= nums[right]) { right = middle; } else { left = middle + 1; } } - return nums[right]; + return nums[left]; } } ``` ## Step 2 -### 右端の値を用いて比較を行うパターン (半開区間) +### 右端の値を用いて比較を行うパターン 何人か他の方が書かれていたので書いてみました。 右端の値が、最小の値かそれよりも右にあるいずれかの値であることを利用した条件判定により二分探索を行います。 @@ -46,7 +49,7 @@ class Solution { ```java class Solution { public int findMin(int[] nums) { - int left = 0, right = nums.length; + int left = 0, right = nums.length - 1; while (left < right) { int middle = left + (right - left) / 2; if (nums[middle] <= nums[nums.length - 1]) { @@ -92,7 +95,7 @@ class Solution { ## Step 3 処理効率の良さでこちらを選びました。 -好みかもしれませんが、右端の値を用いて比較を行うパターン (半開区間) よりも直感的にも思えます。 +好みかもしれませんが、右端の値を用いて比較を行うパターンよりも直感的にも思えます。 ```java /** From 0c50204ca7f9fa0116c33c52f635d28343c7aa79 Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 15:18:59 +0900 Subject: [PATCH 10/12] fix --- .../Binary_Search/find-minimum-in-rotated-sorted-array.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 0e9e0a4..759cf9e 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -11,9 +11,9 @@ LeetCode URL: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array - 閉区間で二分探索を行い、最小の値から始まる範囲とそうでない範囲の境目を探す - 例えば `[3,4,5,1,2]` の場合、最小の値から始まる範囲に属する値を T 、そうでないものを F とすると `[F, F, F, T, T]` となるが、この T の中で一番左側にあるものを探していくイメージ -- 各イテレーションで探索範囲の中央にある値 (以下 middle) を確認し、次のどちらかの処理を行う: +- 各イテレーションで探索範囲の中央 (以下 middle) を確認し、次のどちらかの処理を行う: - middle の位置にある値が right の位置にある値よりも小さい場合、最小の値はそこかそれよりも左の位置にあるため、right を middle の位置に移動させる - - 上の条件に当てはまらない場合、最小の値はそれよりも右の位置にあるため、middle のひとつ右の位置に left を移動させる + - 上の条件に当てはまらない場合、最小の値は middle よりも右の位置にあるため、middle のひとつ右の位置に left を移動させる - 各ポインタは以下示しているため、同じ位置を指したら即ちその位置に存在する値が最小の値であると判断する: - left: これが指す位置よりも左には最小の値が存在しないことを示す - right: これが指す位置にある値が、最小の値かそれよりも右に存在するものであることを示す @@ -94,7 +94,7 @@ class Solution { ## Step 3 -処理効率の良さでこちらを選びました。 +処理効率の良さで while 文終了前に return させるパターンを選びました。 好みかもしれませんが、右端の値を用いて比較を行うパターンよりも直感的にも思えます。 ```java From 683d2b2992abcb3569a92a2708648c60d952b83b Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 22:00:17 +0900 Subject: [PATCH 11/12] step 4 --- .../find-minimum-in-rotated-sorted-array.md | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index 759cf9e..e4a9323 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -76,7 +76,8 @@ class Solution { public int findMin(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { - if (nums[left] < nums[right]) { + // 左端に最小の値がある範囲が探索対象になったかどうかを確認する + if (nums[left] <= nums[right]) { return nums[left]; } @@ -121,3 +122,37 @@ class Solution { } } ``` + +## Step 4 + +### 引数のチェックを行う + +[oda さんの指摘](https://github.com/seal-azarashi/leetcode/pull/39/files#r1846154143)を受けて不正な引数が渡されることを考慮した実装を用意しました。 +Leetcode では使えないですが、The Apache Commons Lang 3 library の [ArrayUtils.isEmpty()](https://commons.apache.org/proper/commons-lang/javadocs/api-3.6/index.html?org/apache/commons/lang3/ArrayUtils.html) を使って配列が null ないし空でないかチェックしています。加えて、ソートされていなければ返す値が正しい保証もないことをコメントに追記しました。 + +```java +import org.apache.commons.lang3.ArrayUtils; + +class Solution { + /** + * Find minimum value in rotated sorted array. + * If the array is not sorted, the results are undefined. + */ + public int findMin(int[] nums) { + if (ArrayUtils.isEmpty(nums)) { + throw new IllegalArgumentException("Argument nums must not be empty"); + } + + int left = 0, right = nums.length - 1; + while (left < right) { + int middle = left + (right - left) / 2; + if (nums[middle] <= nums[right]) { + right = middle; + } else { + left = middle + 1; + } + } + return nums[left]; + } +} +``` From 3c224757a4308d924fb05c6c236fb0483102ce43 Mon Sep 17 00:00:00 2001 From: seal_azarashi Date: Mon, 18 Nov 2024 22:52:22 +0900 Subject: [PATCH 12/12] fix --- arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md | 1 - 1 file changed, 1 deletion(-) diff --git a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md index e4a9323..fced761 100644 --- a/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md +++ b/arai60/Binary_Search/find-minimum-in-rotated-sorted-array.md @@ -76,7 +76,6 @@ class Solution { public int findMin(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { - // 左端に最小の値がある範囲が探索対象になったかどうかを確認する if (nums[left] <= nums[right]) { return nums[left]; }