Leetcode--33. 搜索旋转排序数组
假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個點上進行了旋轉(zhuǎn)。
( 例如,數(shù)組?[0,1,2,4,5,6,7]?可能變?yōu)?[4,5,6,7,0,1,2]?)。
搜索一個給定的目標(biāo)值,如果數(shù)組中存在這個目標(biāo)值,則返回它的索引,否則返回?-1?。
你可以假設(shè)數(shù)組中不存在重復(fù)的元素。
你的算法時間復(fù)雜度必須是?O(log?n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
示例?2:
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
思路:二分查找
每一次先判斷mid在左邊有序范圍內(nèi),還是右邊有序范圍內(nèi)
1.如果在左邊,看target是不是比左邊最小的數(shù)字大,比左邊最大的數(shù)字小
a.如果是,那說明數(shù)字就在左邊有序范圍內(nèi),或者不存在? b. 如果不是,就說明左邊有序范圍不存在,需要mid繼續(xù)往右移動
2. 如果在右邊,看target是不是比右邊最小的數(shù)字大,比右邊最大的數(shù)字小
a.如果是,那說明數(shù)字就在右邊有序范圍內(nèi),或者不存在? b. 如果不是,就說明右邊有序范圍不存在,需要mid繼續(xù)往左移動
提交的代碼:
class?Solution?{
????public?int?search(int[]?nums,?int?target)?{
????????int?high?=?nums.length-1;
????????????int?low?=?0;
????????????int?mid;
????????????mid?=?low+(high-low)/2;
????????????while(low<=high)
????????????{
????????????????
????????????????if(nums[mid]==target)
????????????????{
????????????????????return?mid;
????????????????}
????????????????if(nums[low]<=nums[mid])? //說明現(xiàn)在mid在左邊
????????????????{
????????????????????if(target>=nums[low]&&target<=nums[mid])//說明這個數(shù)字在左邊有序范圍內(nèi)
????????????????????{
????????????????????????high?=?mid-1;
????????????????????}
????????????????????else? ?//只能從右邊找
????????????????????{
????????????????????????low?=?mid+1;
????????????????????}
????????????????}
????????????????else{?//mid在右邊
????????????????????if(target?>=?nums[mid]?&&?target?<=?nums[high]){//在右邊有序范圍內(nèi)
????????????????????????low?=?mid?+1;
????????????????????}else{//只能從左邊找
????????????????????????high?=?mid-1;
????????????????????}
????????????}
????????????????mid?=?low+(high-low)/2;
????????????}
????????????return?-1;
????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--33. 搜索旋转排序数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--287. 寻找重复数
- 下一篇: 【剑指offer】面试题32:从上到下打