From 689d17ad979229e6fd18079c1a357ab42f875933 Mon Sep 17 00:00:00 2001 From: rihib Date: Fri, 9 Aug 2024 19:07:07 +0900 Subject: [PATCH] pullrequests/search_in_rotated_sorted_array --- .../search_in_rotated_sorted_array/step1.go | 31 +++++++++++++++++++ .../search_in_rotated_sorted_array/step2.go | 29 +++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 pullrequests/search_in_rotated_sorted_array/step1.go create mode 100644 pullrequests/search_in_rotated_sorted_array/step2.go diff --git a/pullrequests/search_in_rotated_sorted_array/step1.go b/pullrequests/search_in_rotated_sorted_array/step1.go new file mode 100644 index 0000000..f54e0f3 --- /dev/null +++ b/pullrequests/search_in_rotated_sorted_array/step1.go @@ -0,0 +1,31 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +O(log n)で解くことを期待されていたので、何らかの形で二分探索を使うのだろうとは思っていたのですが、初見では解けなかったので、他の人の回答を参考にしました。 +どちらか片方は必ず必ず昇順にならんでいるということを利用して二分探索を行っています。 +下記は閉区画で解きました。 +*/ +func search_closed(nums []int, target int) int { + left, right := 0, len(nums)-1 + for left <= right { + mid := (left + right) / 2 + if target == nums[mid] { + return mid + } + if nums[left] <= nums[mid] { + if nums[left] <= target && target < nums[mid] { + right = mid - 1 + } else { + left = mid + 1 + } + } else { + if nums[mid] < target && target <= nums[right] { + left = mid + 1 + } else { + right = mid - 1 + } + } + } + return -1 +} diff --git a/pullrequests/search_in_rotated_sorted_array/step2.go b/pullrequests/search_in_rotated_sorted_array/step2.go new file mode 100644 index 0000000..59d3105 --- /dev/null +++ b/pullrequests/search_in_rotated_sorted_array/step2.go @@ -0,0 +1,29 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +半閉区画でも解いてみました。 +*/ +func search_half_closed(nums []int, target int) int { + left, right := 0, len(nums) + for left < right { + mid := (left + right) / 2 + if target == nums[mid] { + return mid + } + if nums[left] <= nums[mid] { + if nums[left] <= target && target < nums[mid] { + right = mid + } else { + left = mid + 1 + } + } else { + if nums[mid] < target && target <= nums[right-1] { + left = mid + 1 + } else { + right = mid + } + } + } + return -1 +}