1. 程式人生 > 其它 >升級es分詞檢索遇到查詢資料量不匹配的問題-問題確認,ik程式碼變更(一)

升級es分詞檢索遇到查詢資料量不匹配的問題-問題確認,ik程式碼變更(一)

一、題目

整數陣列 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

二、解法

思路:二分查詢
在陣列的 leftright 之間查詢。剛開始是 [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);
    }
}