File tree Expand file tree Collapse file tree 2 files changed +60
-0
lines changed
pullrequests/search_in_rotated_sorted_array Expand file tree Collapse file tree 2 files changed +60
-0
lines changed Original file line number Diff line number Diff line change 1+ //lint:file-ignore U1000 Ignore all unused code
2+ package template
3+
4+ /*
5+ O(log n)で解くことを期待されていたので、何らかの形で二分探索を使うのだろうとは思っていたのですが、初見では解けなかったので、他の人の回答を参考にしました。
6+ どちらか片方は必ず必ず昇順にならんでいるということを利用して二分探索を行っています。
7+ 下記は閉区画で解きました。
8+ */
9+ func search_closed (nums []int , target int ) int {
10+ left , right := 0 , len (nums )- 1
11+ for left <= right {
12+ mid := (left + right ) / 2
13+ if target == nums [mid ] {
14+ return mid
15+ }
16+ if nums [left ] <= nums [mid ] {
17+ if nums [left ] <= target && target < nums [mid ] {
18+ right = mid - 1
19+ } else {
20+ left = mid + 1
21+ }
22+ } else {
23+ if nums [mid ] < target && target <= nums [right ] {
24+ left = mid + 1
25+ } else {
26+ right = mid - 1
27+ }
28+ }
29+ }
30+ return - 1
31+ }
Original file line number Diff line number Diff line change 1+ //lint:file-ignore U1000 Ignore all unused code
2+ package template
3+
4+ /*
5+ 半閉区画でも解いてみました。
6+ */
7+ func search_half_closed (nums []int , target int ) int {
8+ left , right := 0 , len (nums )
9+ for left < right {
10+ mid := (left + right ) / 2
11+ if target == nums [mid ] {
12+ return mid
13+ }
14+ if nums [left ] <= nums [mid ] {
15+ if nums [left ] <= target && target < nums [mid ] {
16+ right = mid
17+ } else {
18+ left = mid + 1
19+ }
20+ } else {
21+ if nums [mid ] < target && target <= nums [right - 1 ] {
22+ left = mid + 1
23+ } else {
24+ right = mid
25+ }
26+ }
27+ }
28+ return - 1
29+ }
You can’t perform that action at this time.
0 commit comments