# äºåæç´¢ ## äºåæç´¢æ¨¡æ¿ ç»ä¸ä¸ª**æåºæ°ç»**åç®æ å¼ï¼æ¾ç¬¬ä¸æ¬¡/æå䏿¬¡/ä»»ä½ä¸æ¬¡åºç°çç´¢å¼ï¼å¦ææ²¡æåºç°è¿å-1 模æ¿åç¹è¦ç´ - 1ãåå§åï¼start=0ãend=len-1 - 2ã循ç¯éåºæ¡ä»¶ï¼start + 1 < end - 3ãæ¯è¾ä¸ç¹åç®æ å¼ï¼A[mid] ==ã <ã> target - 4ã夿æå两个å ç´ æ¯å¦ç¬¦åï¼A[start]ãA[end] ? target æ¶é´å¤æåº¦ O(logn)ï¼ä½¿ç¨åºæ¯ä¸è¬æ¯æåºæ°ç»çæ¥æ¾ å ¸åç¤ºä¾ [binary-search](https://leetcode-cn.com/problems/binary-search/) > ç»å®ä¸ä¸ª  n 个å ç´ æåºçï¼ååºï¼æ´åæ°ç»  nums åä¸ä¸ªç®æ å¼ Â target  ï¼åä¸ä¸ªå½æ°æç´¢  nums ä¸ç targetï¼å¦æç®æ å¼åå¨è¿å䏿 ï¼å¦åè¿å -1ã ```go // äºåæç´¢æå¸¸ç¨æ¨¡æ¿ func search(nums []int, target int) int { // 1ãåå§åstartãend start := 0 end := len(nums) - 1 // 2ãå¤çforå¾ªç¯ for start+1 < end { mid := start + (end-start)/2 // 3ãæ¯è¾a[mid]åtargetå¼ if nums[mid] == target { end = mid } else if nums[mid] < target { start = mid } else if nums[mid] > target { end = mid } } // 4ãæåå©ä¸ä¸¤ä¸ªå ç´ ï¼æå¨å¤æ if nums[start] == target { return start } if nums[end] == target { return end } return -1 } ``` 大é¨åäºåæ¥æ¾ç±»çé¢ç®é½å¯ä»¥ç¨è¿ä¸ªæ¨¡æ¿ï¼ç¶ååä¸ç¹ç¹æ®é»è¾å³å¯ å¦å¤äºåæ¥æ¾è¿æä¸äºå ¶ä»æ¨¡æ¿å¦ä¸å¾ï¼å¤§é¨ååºæ¯æ¨¡æ¿#3 é½è½è§£å³é®é¢ï¼èä¸è¿è½æ¾ç¬¬ä¸æ¬¡/æå䏿¬¡åºç°çä½ç½®ï¼åºç¨æ´å å¹¿æ³  æä»¥ç¨æ¨¡æ¿#3 就对äºï¼è¯¦ç»ç对æ¯å¯ä»¥è¿è¾¹æç« ä»ç»ï¼[äºåæç´¢æ¨¡æ¿](https://leetcode-cn.com/explore/learn/card/binary-search/212/template-analysis/847/) å¦ææ¯æç®åçäºåæç´¢ï¼ä¸éè¦æ¾ç¬¬ä¸ä¸ªãæåä¸ä¸ªä½ç½®ãæè æ¯æ²¡æéå¤å ç´ ï¼å¯ä»¥ä½¿ç¨æ¨¡æ¿#1ï¼ä»£ç æ´ç®æ´ ```go // æ éå¤å ç´ æç´¢æ¶ï¼æ´æ¹ä¾¿ func search(nums []int, target int) int { start := 0 end := len(nums) - 1 for start <= end { mid := start + (end-start)/2 if nums[mid] == target { return mid } else if nums[mid] < target { start = mid+1 } else if nums[mid] > target { end = mid-1 } } // 妿æ¾ä¸å°ï¼start æ¯ç¬¬ä¸ä¸ªå¤§äºtargetçç´¢å¼ // 妿å¨B+æ ç»æéé¢äºåæç´¢ï¼å¯ä»¥return start // è¿æ ·å¯ä»¥ç»§ç»ååèç¹æç´¢ï¼å¦ï¼node:=node.Children[start] return -1 } ``` ## 常è§é¢ç® ### [search-for-range](https://www.lintcode.com/problem/search-for-a-range/description) > ç»å®ä¸ä¸ªå å« n ä¸ªæ´æ°çæåºæ°ç»ï¼æ¾åºç»å®ç®æ å¼ target çèµ·å§åç»æä½ç½®ã > å¦æç®æ å¼ä¸å¨æ°ç»ä¸ï¼åè¿å`[-1, -1]` æè·¯ï¼æ ¸å¿ç¹å°±æ¯æ¾ç¬¬ä¸ä¸ª target çç´¢å¼ï¼åæåä¸ä¸ª target çç´¢å¼ï¼æä»¥ç¨ä¸¤æ¬¡äºåæç´¢å嫿¾ç¬¬ä¸æ¬¡åæå䏿¬¡çä½ç½® ```go func searchRange (A []int, target int) []int { if len(A) == 0 { return []int{-1, -1} } result := make([]int, 2) start := 0 end := len(A) - 1 for start+1 < end { mid := start + (end-start)/2 if A[mid] > target { end = mid } else if A[mid] < target { start = mid } else { // 妿ç¸çï¼åºè¯¥ç»§ç»åå·¦æ¾ï¼å°±è½æ¾å°ç¬¬ä¸ä¸ªç®æ å¼çä½ç½® end = mid } } // æç´¢å·¦è¾¹çç´¢å¼ if A[start] == target { result[0] = start } else if A[end] == target { result[0] = end } else { result[0] = -1 result[1] = -1 return result } start = 0 end = len(A) - 1 for start+1 < end { mid := start + (end-start)/2 if A[mid] > target { end = mid } else if A[mid] < target { start = mid } else { // 妿ç¸çï¼åºè¯¥ç»§ç»å峿¾ï¼å°±è½æ¾å°æåä¸ä¸ªç®æ å¼çä½ç½® start = mid } } // æç´¢å³è¾¹çç´¢å¼ if A[end] == target { result[1] = end } else if A[start] == target { result[1] = start } else { result[0] = -1 result[1] = -1 return result } return result } ``` ### [search-insert-position](https://leetcode-cn.com/problems/search-insert-position/) > ç»å®ä¸ä¸ªæåºæ°ç»åä¸ä¸ªç®æ å¼ï¼å¨æ°ç»ä¸æ¾å°ç®æ å¼ï¼å¹¶è¿åå ¶ç´¢å¼ãå¦æç®æ å¼ä¸åå¨äºæ°ç»ä¸ï¼è¿åå®å°ä¼è¢«æé¡ºåºæå ¥çä½ç½®ã ```go func searchInsert(nums []int, target int) int { // æè·¯ï¼æ¾å°ç¬¬ä¸ä¸ª >= target çå ç´ ä½ç½® start := 0 end := len(nums) - 1 for start+1 < end { mid := start + (end-start)/2 if nums[mid] == target { // æ è®°å¼å§ä½ç½® start = mid } else if nums[mid] > target { end = mid } else { start = mid } } if nums[start] >= target { return start } else if nums[end] >= target { return end } else if nums[end] < target { // ç®æ 弿¯ææå¼é½å¤§ return end + 1 } return 0 } ``` ### [search-a-2d-matrix](https://leetcode-cn.com/problems/search-a-2d-matrix/) > ç¼åä¸ä¸ªé«æçç®æ³æ¥å¤æ  m x n ç©éµä¸ï¼æ¯å¦åå¨ä¸ä¸ªç®æ å¼ã该ç©éµå ·æå¦ä¸ç¹æ§ï¼ > > - æ¯è¡ä¸çæ´æ°ä»å·¦å°å³æååºæåã > - æ¯è¡ç第ä¸ä¸ªæ´æ°å¤§äºåä¸è¡çæåä¸ä¸ªæ´æ°ã ```go func searchMatrix(matrix [][]int, target int) bool { // æè·¯ï¼å°2纬æ°ç»è½¬ä¸º1ç»´æ°ç» è¿è¡äºåæç´¢ if len(matrix) == 0 || len(matrix[0]) == 0 { return false } row := len(matrix) col := len(matrix[0]) start := 0 end := row*col - 1 for start+1 < end { mid := start + (end-start)/2 // è·å2纬æ°ç»å¯¹åºå¼ val := matrix[mid/col][mid%col] if val > target { end = mid } else if val < target { start = mid } else { return true } } if matrix[start/col][start%col] == target || matrix[end/col][end%col] == target{ return true } return false } ``` ### [first-bad-version](https://leetcode-cn.com/problems/first-bad-version/) > åè®¾ä½ æ n ä¸ªçæ¬ [1, 2, ..., n]ï¼ä½ æ³æ¾åºå¯¼è´ä¹åææçæ¬åºéç第ä¸ä¸ªé误ççæ¬ã > ä½ å¯ä»¥éè¿è°ç¨  bool isBadVersion(version) æ¥å£æ¥å¤æçæ¬å· version æ¯å¦å¨åå æµè¯ä¸åºéãå®ç°ä¸ä¸ªå½æ°æ¥æ¥æ¾ç¬¬ä¸ä¸ªé误ççæ¬ãä½ åºè¯¥å°½éåå°å¯¹è°ç¨ API çæ¬¡æ°ã ```go func firstBadVersion(n int) int { // æè·¯ï¼äºåæç´¢ start := 0 end := n for start+1 < end { mid := start + (end - start)/2 if isBadVersion(mid) { end = mid } else if isBadVersion(mid) == false { start = mid } } if isBadVersion(start) { return start } return end } ``` ### [find-minimum-in-rotated-sorted-array](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/) > å设æç §ååºæåºçæ°ç»å¨é¢å æªç¥çæä¸ªç¹ä¸è¿è¡äºæè½¬( ä¾å¦ï¼æ°ç»  [0,1,2,4,5,6,7] å¯è½å为  [4,5,6,7,0,1,2] )ã > 请æ¾åºå ¶ä¸æå°çå ç´ ã ```go func findMin(nums []int) int { // æè·¯ï¼/ / æåä¸ä¸ªå¼ä½ä¸ºtargetï¼ç¶åå¾å·¦ç§»å¨ï¼æåæ¯è¾startãendçå¼ if len(nums) == 0 { return -1 } start := 0 end := len(nums) - 1 for start+1 < end { mid := start + (end-start)/2 // æåä¸ä¸ªå ç´ å¼ä¸ºtarget if nums[mid] <= nums[end] { end = mid } else { start = mid } } if nums[start] > nums[end] { return nums[end] } return nums[start] } ``` ### [find-minimum-in-rotated-sorted-array-ii](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/) > å设æç §ååºæåºçæ°ç»å¨é¢å æªç¥çæä¸ªç¹ä¸è¿è¡äºæè½¬ > ( ä¾å¦ï¼æ°ç»  [0,1,2,4,5,6,7] å¯è½å为  [4,5,6,7,0,1,2] )ã > 请æ¾åºå ¶ä¸æå°çå ç´ ã(å å«éå¤å ç´ ) ```go func findMin(nums []int) int { // æè·¯ï¼è·³è¿éå¤å ç´ ï¼midå¼åend弿¯è¾ï¼åä¸ºä¸¤ç§æ åµè¿è¡å¤ç if len(nums) == 0 { return -1 } start := 0 end := len(nums) - 1 for start+1 < end { // å»é¤éå¤å ç´ for start < end && nums[end] == nums[end-1] { end-- } for start < end && nums[start] == nums[start+1] { start++ } mid := start + (end-start)/2 // ä¸é´å ç´ åæåä¸ä¸ªå ç´ æ¯è¾ï¼å¤æä¸é´ç¹è½å¨å·¦è¾¹ä¸ååºï¼è¿æ¯å³è¾¹ä¸ååºï¼ if nums[mid] <= nums[end] { end = mid } else { start = mid } } if nums[start] > nums[end] { return nums[end] } return nums[start] } ``` ### [search-in-rotated-sorted-array](https://leetcode-cn.com/problems/search-in-rotated-sorted-array/) > å设æç §ååºæåºçæ°ç»å¨é¢å æªç¥çæä¸ªç¹ä¸è¿è¡äºæè½¬ã > ( ä¾å¦ï¼æ°ç»  [0,1,2,4,5,6,7] å¯è½å为  [4,5,6,7,0,1,2] )ã > æç´¢ä¸ä¸ªç»å®çç®æ å¼ï¼å¦ææ°ç»ä¸åå¨è¿ä¸ªç®æ å¼ï¼åè¿åå®çç´¢å¼ï¼å¦åè¿å  -1 ã > ä½ å¯ä»¥å设æ°ç»ä¸ä¸åå¨éå¤çå ç´ ã ```go func search(nums []int, target int) int { // æè·¯ï¼/ / 两æ¡ä¸åç´çº¿ï¼åç§æ åµå¤æ if len(nums) == 0 { return -1 } start := 0 end := len(nums) - 1 for start+1 < end { mid := start + (end-start)/2 // ç¸çç´æ¥è¿å if nums[mid] == target { return mid } // 夿å¨é£ä¸ªåºé´ï¼å¯è½å为åç§æ åµ if nums[start] < nums[mid] { if nums[start] <= target && target <= nums[mid] { end = mid } else { start = mid } } else if nums[end] > nums[mid] { if nums[end] >= target && nums[mid] <= target { start = mid } else { end = mid } } } if nums[start] == target { return start } else if nums[end] == target { return end } return -1 } ``` 注æç¹ > é¢è¯æ¶ï¼å¯ä»¥ç´æ¥ç»å¾è¿è¡è¾ å©è¯´æï¼ç©ºè®²å¾å®¹æè®©å¤§å®¶é½æ¯è¾èå ### [search-in-rotated-sorted-array-ii](https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/) > å设æç §ååºæåºçæ°ç»å¨é¢å æªç¥çæä¸ªç¹ä¸è¿è¡äºæè½¬ã > ( ä¾å¦ï¼æ°ç»  [0,0,1,2,2,5,6] å¯è½å为  [2,5,6,0,0,1,2] )ã > ç¼åä¸ä¸ªå½æ°æ¥å¤æç»å®çç®æ 弿¯å¦åå¨äºæ°ç»ä¸ãè¥åå¨è¿å  trueï¼å¦åè¿å  falseã(å å«éå¤å ç´ ) ```go func search(nums []int, target int) bool { // æè·¯ï¼/ / 两æ¡ä¸åç´çº¿ï¼åç§æ åµå¤æï¼å¹¶ä¸å¤çé夿°å if len(nums) == 0 { return false } start := 0 end := len(nums) - 1 for start+1 < end { // å¤çé夿°å for start < end && nums[start] == nums[start+1] { start++ } for start < end && nums[end] == nums[end-1] { end-- } mid := start + (end-start)/2 // ç¸çç´æ¥è¿å if nums[mid] == target { return true } // 夿å¨é£ä¸ªåºé´ï¼å¯è½å为åç§æ åµ if nums[start] < nums[mid] { if nums[start] <= target && target <= nums[mid] { end = mid } else { start = mid } } else if nums[end] > nums[mid] { if nums[end] >= target && nums[mid] <= target { start = mid } else { end = mid } } } if nums[start] == target || nums[end] == target { return true } return false } ``` ## æ»ç» äºåæç´¢æ ¸å¿åç¹è¦ç´ ï¼å¿ è&çè§£ï¼ - 1ãåå§åï¼start=0ãend=len-1 - 2ã循ç¯éåºæ¡ä»¶ï¼start + 1 < end - 3ãæ¯è¾ä¸ç¹åç®æ å¼ï¼A[mid] ==ã <ã> target - 4ã夿æå两个å ç´ æ¯å¦ç¬¦åï¼A[start]ãA[end] ? target ## ç»ä¹ é¢ - [ ] [search-for-range](https://www.lintcode.com/problem/search-for-a-range/description) - [ ] [search-insert-position](https://leetcode-cn.com/problems/search-insert-position/) - [ ] [search-a-2d-matrix](https://leetcode-cn.com/problems/search-a-2d-matrix/) - [ ] [first-bad-version](https://leetcode-cn.com/problems/first-bad-version/) - [ ] [find-minimum-in-rotated-sorted-array](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/) - [ ] [find-minimum-in-rotated-sorted-array-ii](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/) - [ ] [search-in-rotated-sorted-array](https://leetcode-cn.com/problems/search-in-rotated-sorted-array/) - [ ] [search-in-rotated-sorted-array-ii](https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/)