Skip to content

Commit 0e6f891

Browse files
committed
refactor search in rotated sorted array
1 parent e09c7d6 commit 0e6f891

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

go/search_in_rotated_sorted_array.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ func searchClosed(nums []int, target int) int {
88
if nums[mid] == target {
99
return mid
1010
}
11+
// ここでは左側がソートされているかを判定しているが
12+
// nums[left] < nums[mid]としてしまうと
13+
// left == midになるとき(例えばnums=[3, 1])
14+
// 左側がソートされていないと判断されて
15+
// 誤った条件分岐に入ってしまう
1116
if nums[left] <= nums[mid] {
1217
if nums[left] <= target && target < nums[mid] {
1318
right = mid - 1
@@ -34,7 +39,14 @@ func searchHalfClosed(nums []int, target int) int {
3439
if nums[mid] == target {
3540
return mid
3641
}
37-
if nums[left] < nums[mid] {
42+
// ここでは左側がソートされているかを判定しているが
43+
// searchClosedとは違ってsearchHalfClosedの場合は
44+
// nums[left] < nums[mid]でも、nums[left] <= nums[mid]でも問題なく動作する
45+
// なぜならsearchHalfClosedでは、nums内にtargetが存在する場合において
46+
// left == mid && nums[mid] != targetになることはないので
47+
// left == midになってもバグらないためである
48+
// 単にたまたまバグらないだけで、意味的にnums[left] <= nums[mid]の方が適切
49+
if nums[left] <= nums[mid] {
3850
if nums[left] <= target && target < nums[mid] { // leftがtargetの可能性もあるので<=とする
3951
right = mid
4052
} else {

0 commit comments

Comments
 (0)