33. Search in Rotated Sorted Array 2019-04-04

方法1.例如4,5,6,7,0,1,2

? ? 首先取中間值,取完中間值之后左右總有一邊的是升序的排列,判斷target的值是否在這個序列里面,

如果在,直接在這個序列里做二分查找,如果不在,則繼續(xù)在另外的序列做上訴的判斷。

時間復雜度:O(logn).

注意:主要是要時刻注意臨界值,什么時候跳出循環(huán)要把握好,否則可能陷入死循環(huán)。

這道題主要是考驗了對二分查找的運用。

class Solution {

? ? public int search(int[] nums, int target) {

? ? ? ? int mid;

? ? ? ? int start=0,end=nums.length-1;

? ? ? ? int count=-1;

? ? ? ? while(start<=end){

? ? ? ? ? ? mid=(start+end)/2;

? ? ? ? ? ? if(target==nums[mid]){

? ? ? ? ? ? ? ? count=mid;

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? if(nums[start]<=nums[mid]){

? ? ? ? ? ? ? ? if(target>=nums[start]&&target<=nums[mid]){

? ? ? ? ? ? ? ? ? ? end=mid-1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else{

? ? ? ? ? ? ? ? ? ? start=mid+1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? if(target>=nums[mid]&&target<=nums[end]){

? ? ? ? ? ? ? ? ? ? start=mid+1;

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? end=mid-1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return count;

? ? }

}

方法2:先用二分法找到最小值的坐標,然后再進行二分。


class Solution {

? ? public int search(int[] nums, int target) {

? ? ? ? int start=0,end=nums.length-1;

? ? ? ? int mid;

? ? ? ? //先找到最小的值的坐標

? ? ? ? while(start<end){

? ? ? ? ? ? mid=(start+end)/2;

? ? ? ? ? ? if(nums[mid]>nums[end]){

? ? ? ? ? ? ? ? start=mid+1;

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? end=mid;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? int min=end;

? ? ? // System.out.println(min);

? ? ? ? if(nums.length==0){

? ? ? ? ? ? return -1;

? ? ? ? }

? ? ? ? if(target>=nums[0]&&min>0&&target<=nums[min-1]){


? ? ? ? ? ? return binaryFind(0,min-1,nums,target);?

? ? ? ? }

? ? ? ? if(target>=nums[min]&&target<=nums[nums.length-1]){

? ? ? ? ? ? return binaryFind(min,nums.length-1,nums,target);

? ? ? ? }

? ? ? ? return -1;


? ? }

? ? public int binaryFind(int start,int end,int[] nums,int target){

? ? ? ? int mid;

? ? ? ? while(start<=end){

? ? ? ? ? ? ? ? mid=start+(end-start)/2;

? ? ? ? ? ? ? ? if(nums[mid]==target){

? ? ? ? ? ? ? ? ? ? return mid;

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if(target>nums[mid]){

? ? ? ? ? ? ? ? ? ? start=mid+1;

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? end=mid-1;

? ? ? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return -1;

? ? }

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容