二分查找
之前刷的系列题,只记录了两道比较经典的。
后面回顾会添加。
题目
Leetcode 34.在排序数组中查找元素的第一个和最后一个位置
Leetcode 33. 搜索旋转排序数组
LeetCode 34
解题思路
因为是排好序的数组,按二分查找,先找到最左边的符合 target的,再找最右边的。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| func searchRange(nums []int, target int) []int { var res = []int{-1,-1} if len(nums) == 0{ return res } var left,right,mid int = 0, len(nums) - 1, len(nums) / 2 for left <= right{ if nums[mid] < target{ left = mid + 1 }else{ right = mid - 1 } mid = (left + right) / 2 } if left == len(nums){ return res } res[0] = left left,right,mid = 0, len(nums) - 1, len(nums) / 2 for left <= right{ if nums[mid] <= target{ left = mid + 1 }else{ right = mid - 1 } mid = (left + right) / 2 } res[1] = right if res[0] > res[1]{ return []int{-1,-1} } return res }
|
LeetCode 33
解题思路
最重要的思路是:将数组一分为二,则一分为二的两个数组,一个必定是有序的,一个必定是无序的。
实现代码
二分实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| func search(nums []int, target int) int { left,right := 0, len(nums) - 1 var mid int for left <= right{ mid = (left + right) / 2 if nums[mid] == target{ return mid }else 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 }
|