| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | 
							- package main
 
- import (
 
- 	"fmt"
 
- )
 
- func search(nums []int, target int) bool {
 
- 	beg, end := 0, len(nums)-1
 
- 	// for empty array
 
- 	if end == -1 {
 
- 		return false
 
- 	}
 
- 	// check if the target is at the beg or at the end of the arr
 
- 	if nums[beg] == target || nums[end] == target {
 
- 		return true
 
- 	}
 
- 	// the array is not rotated
 
- 	if nums[beg] < nums[end] {
 
- 		return binarySearch(nums, target, beg, end)
 
- 	}
 
- 	// else find the top of the clip
 
- 	for beg < end {
 
- 		mid := (beg + end) / 2
 
- 		if nums[mid] > nums[beg] {
 
- 			beg = mid
 
- 		} else if nums[mid] < nums[end] {
 
- 			end = mid
 
- 		} else {
 
- 			// find the top point one by one
 
- 			if nums[beg] > nums[beg+1] {
 
- 				break
 
- 			}
 
- 			beg++
 
- 		}
 
- 	}
 
- 	// check the area where the target is in
 
- 	if target > nums[0] {
 
- 		return binarySearch(nums, target, 0, beg)
 
- 	}
 
- 	return binarySearch(nums, target, beg+1, len(nums)-1)
 
- }
 
- func binarySearch(nums []int, target, beg, end int) bool {
 
- 	for beg <= end {
 
- 		mid := (beg + end) / 2
 
- 		if nums[mid] > target {
 
- 			end = mid - 1
 
- 		} else if nums[mid] < target {
 
- 			beg = mid + 1
 
- 		} else {
 
- 			return true
 
- 		}
 
- 	}
 
- 	return false
 
- }
 
- func testSearch(nums []int, target int) {
 
- 	isIn := search(nums, target)
 
- 	checkAgain := false
 
- 	for _, num := range nums {
 
- 		if num == target {
 
- 			checkAgain = true
 
- 			break
 
- 		}
 
- 	}
 
- 	fmt.Println(isIn, checkAgain)
 
- }
 
- /* func main() {
 
- 	nums1 := []int{4, 5, 6, 7, 0, 1, 2}
 
- 	nums2 := []int{2, 5, 6, 0, 0, 1, 2}
 
- 	nums3 := []int{1, 2, 3, 4, 5}
 
- 	nums4 := []int{1, 1}
 
- 	testSearch(nums1, 1)
 
- 	testSearch(nums2, 0)
 
- 	testSearch(nums3, 5)
 
- 	testSearch(nums4, 0)
 
- } */
 
 
  |