leetcode 旋转数组搜索

lt33 搜索旋转数组

找到target下标,不在则返回-1

func search(nums []int, target int) int {
	//边界判断
	if len(nums)==0{
		return -1
	}
	l:=0
	r:=len(nums)-1
	for l<=r{
		mid:=l+(r-l)/2
		if nums[mid]==target{
			return mid
		}
		//分为左边有序和右边有序
		if nums[l]<=nums[mid]{//左边有序
			//在左边和不再左边
			if nums[l]<=target&&target<=nums[mid]{
				r = mid-1
			}else{
				l = mid+1
			}
		}else{
			//在右边和不再右边
			if nums[mid]<=target&&target<=nums[r]{
				l = mid+1
			}else{
				r = mid-1
			}

		}
	}
	//都不是反-1
	return -1
}

lt34 排序数组寻找第一个和最后一个位置

func searchRange(nums []int, target int) []int {
	res:=[]int{-1,-1}
	if len(nums)==0{
		return res
	}
	l:=0
	r:=len(nums)-1
	for l<=r{
		mid:=l+(r-l)/2
		if nums[mid]>target{
			r = mid-1
		}else if nums[mid]<target{
			l = mid+1
		}else{
			start:=mid
			end:=mid
			for start>0&&nums[start-1]==target{
				start--
			}
			for end<len(nums)-1&&nums[end+1]==target{
				end++
			}
			res[0] = start
			res[1] = end
			return res
		}
	}
	return res
}

lt 153旋转数组搜索最小值I

数组元素不重复

func findMin(nums []int) int {
	if len(nums)==0{
		return 0
	}
	//判断中间和最右边的关系
	l:=0
	r:=len(nums)-1
	for l<r{
		mid:=l+(r-l)/2
		if nums[mid]>nums[r]{
			l = mid+1
		}else{
			r = mid
		}
	}
	return nums[l]
}

lt 154旋转数组搜索最小值II

数组包含重复元素
增加判断重复元素的步骤

func findMin(nums []int) int {
	if len(nums)==0{
		return 0
	}
	//判断中间和最右边的关系
	l:=0
	r:=len(nums)-1
	for l<r{
		//增加判断重复元素
		for l<r&&nums[l]==nums[l+1]{
			l++
		}
		for l<r&&nums[r]==nums[r-1]{
			r--
		}
		mid:=l+(r-l)/2
		if nums[mid]>nums[r]{
			l = mid+1
		}else{
			r = mid
		}
	}
	return nums[l]
}
原文地址:https://www.cnblogs.com/9527s/p/14372449.html