二分查找

二分查詢算法
二分查找(binary search),也稱折半搜索,是一種在有序數(shù)組中查找某一特定元素的搜索算法。

時間復雜度:折半搜索每次把搜索區(qū)域減少一半,時間復雜度為O(log n)。
空間復雜度: O(1)。

// 遞歸實現(xiàn)
private int binarysearch(int[] array, int low, int hight, int target) {
    if (low > hight) {
        return -1;
    }
    int mid = low + (hight - low) / 2;
    if (target == array[mid]) {
        return mid;
    } else if (target > array[mid]) {
        return binarysearch(array, mid + 1, hight, target);
    } else {
        return binarysearch(array, low, mid - 1, target);
    }
}
// 循環(huán)實現(xiàn)
public int binarysearch(int[] array, int target) {
    int low = 0;
    int hight = array.length - 1;
    while (low >= hight) {
        int mid = low + (hight - low) / 2;
        if (array[mid] == target) {
            return mid;
        } else if (target > array[mid]) {
            low = mid + 1;
        } else {
            hight = mid - 1;
        }
    }
    return -1;
}
// Arrays.binarySearch使用
    1、若在數(shù)組中找到值,則返回該值得下標
    2、若沒有找到,則返回值為負的插入點值(從1開始)
public int bestSeqAtIndex2(int[] height, int[] weight) {
    int len = height.length;
    int[][] arrs = new int[len][2];
    for (int i = 0; i < len; i++) {
        arrs[i][0] = height[i];
        arrs[i][1] = weight[i];
    }
    // 按照身高排序(升) 升高相同按照體重排序(降)
    Arrays.sort(arrs, (a, b) -> a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
    // 求體重最長遞增子序列
    // 初始化長度
    int res = 0;
    // 初始化數(shù)組
    int[] dp = new int[len];
    for (int[] arr : arrs) {
        int i = Arrays.binarySearch(dp, 0, res, arr[1]);
        if (i < 0) {
            // 該值應該放入的位置
            i = -(i + 1);
        }
        dp[i] = arr[1];
        // 維護最長遞增子序列的長度
        if (i == res) {
            res++;
        }
    }
    return res;
}

馬戲團人塔

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容