升級es分詞檢索遇到查詢資料量不匹配的問題-問題確認,ik程式碼變更(一)
阿新 • • 發佈:2021-06-21
一、題目
整數陣列 nums
按升序排列,陣列中的值 互不相同 。
在傳遞給函式之前,nums
在預先未知的某個下標 k(0 <= k < nums.length)
上進行了 旋轉,使陣列變為 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下標 從 0 開始 計數)。例如, [0,1,2,4,5,6,7]
在下標 3 處經旋轉後可能變為[4,5,6,7,0,1,2]
。
給你 旋轉後 的陣列 nums
和一個整數 target
,如果 nums
中存在這個目標值 target
,則返回它的下標,否則返回-1
二、解法
思路:二分查詢
在陣列的 left
和 right
之間查詢。剛開始是 [0,length-1]
範圍。當 right-left+1==0
是停止查詢(長度為1)。
mid=left+(right-left)/2
,分成兩部分 [left,mid]
和 [mid+1,right]
,問題在於要選擇哪一部分。由於陣列是旋轉的升序陣列,分成兩部分後,必然有一部分是升序的,另一部分可能是升序,也有可能是兩段升序拼起來的。那麼對於其中升序的陣列,進行判斷是否在其中,如果不在,就去另一部分中查詢。
class Solution { public int binarySearch(int[] nums,int target,int left,int right){ int len=right-left+1; if(len==1){ if(nums[left]==target) return left; else return -1; }else{ int mid=left+(right-left)/2; if(nums[left]<=nums[mid]){ //左邊是升序 if(target>=nums[left]&&target<=nums[mid]){ return binarySearch(nums,target,left,mid); }else{ return binarySearch(nums,target,mid+1,right); } }else{ //右邊是升序 if(target>=nums[mid+1]&&target<=nums[right]){ return binarySearch(nums,target,mid+1,right); }else{ return binarySearch(nums,target,left,mid); } } } } public int search(int[] nums, int target) { int len=nums.length; return binarySearch(nums,target,0,len-1); } }