欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)二分法變種的示例代碼

 更新時(shí)間:2024年04月30日 10:14:05   作者:一葉浮萍?xì)w大海  
這篇文章主要為大家介紹了Java實(shí)現(xiàn)二分法變種的示例代碼復(fù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、引言

二分法,又稱(chēng)二分查找、折半查找,是一種在有序數(shù)組中查找某一特定元素的搜索算法。其核心思想是通過(guò)將目標(biāo)數(shù)據(jù)與有序的數(shù)據(jù)序列進(jìn)行比較,每次查找都將數(shù)據(jù)序列一分為二,確定目標(biāo)數(shù)據(jù)在哪一半中,直到找到目標(biāo)數(shù)據(jù)或者確定目標(biāo)數(shù)據(jù)不存在。二分法的時(shí)間復(fù)雜度為O(log n),相比于順序查找的O(n),效率更高。然而,在實(shí)際應(yīng)用中,我們可能會(huì)遇到一些特殊情況,需要對(duì)二分法進(jìn)行一定的變種以滿(mǎn)足特定的需求。本文將介紹幾種常見(jiàn)的二分法變種,并給出Java實(shí)現(xiàn)。

二、二分法變種

  • 查找第一個(gè)等于給定值的元素

在某些情況下,我們不僅需要判斷數(shù)組中是否存在某個(gè)元素,還需要找到該元素在數(shù)組中的第一個(gè)位置。這可以通過(guò)在二分查找的基礎(chǔ)上稍作修改來(lái)實(shí)現(xiàn)。當(dāng)找到目標(biāo)元素時(shí),我們并不立即返回,而是繼續(xù)向左查找,直到找到第一個(gè)等于目標(biāo)值的元素。

Java實(shí)現(xiàn)如下:

public int findFirstEqual(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] >= target) {
            right = mid - 1; // 繼續(xù)向左查找
        } else {
            left = mid + 1;
        }
    }
    // 檢查left是否越界以及nums[left]是否等于target
    if (left >= 0 && nums[left] == target) {
        return left;
    } else {
        return -1; // 未找到
    }
}
  • 查找最后一個(gè)等于給定值的元素

與查找第一個(gè)等于給定值的元素類(lèi)似,我們也可以通過(guò)修改二分查找算法來(lái)找到最后一個(gè)等于給定值的元素。當(dāng)找到目標(biāo)元素時(shí),我們并不立即返回,而是繼續(xù)向右查找,直到找到最后一個(gè)等于目標(biāo)值的元素。

Java實(shí)現(xiàn)如下:

public int findLastEqual(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1; // 繼續(xù)向右查找
        }
    }
    // 檢查right是否越界以及nums[right]是否等于target
    if (right >= 0 && nums[right] == target) {
        return right;
    } else {
        return -1; // 未找到
    }
}
  • 查找插入位置

在某些情況下,我們需要在有序數(shù)組中插入一個(gè)元素,并返回插入后的索引。如果數(shù)組中已存在該元素,則返回該元素的索引;否則,返回應(yīng)該插入的位置。這同樣可以通過(guò)修改二分查找算法來(lái)實(shí)現(xiàn)。

Java實(shí)現(xiàn)如下:

public int searchInsert(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid; // 找到目標(biāo)元素,返回其索引
        } else if (nums[mid] < target) {
            left = mid + 1; // 目標(biāo)元素在右半部分
        } else {
            right = mid - 1; // 目標(biāo)元素在左半部分或不存在(此時(shí)right指向的位置應(yīng)插入target)
        }
    }
    // 未找到目標(biāo)元素,返回應(yīng)插入的位置
    return left;
}

三、總結(jié)

本文介紹了三種常見(jiàn)的二分法變種:查找第一個(gè)等于給定值的元素、查找最后一個(gè)等于給定值的元素和查找插入位置,并給出了相應(yīng)的Java實(shí)現(xiàn)。這些變種算法都是在原始二分查找算法的基礎(chǔ)上進(jìn)行了一定的修改和擴(kuò)展,以滿(mǎn)足特定的需求。在實(shí)際應(yīng)用中,我們可以根據(jù)具體的問(wèn)題選擇合適的變種算法來(lái)解決問(wèn)題。

到此這篇關(guān)于Java實(shí)現(xiàn)二分法變種的示例代碼的文章就介紹到這了,更多相關(guān)Java 二分法變種內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot中使用redis的方法代碼詳解

    springboot中使用redis的方法代碼詳解

    &#8203;redis 作為一個(gè)高性能的內(nèi)存數(shù)據(jù)庫(kù),如果不會(huì)用就太落伍了,之前在 node.js 中用過(guò) redis,本篇記錄如何將 redis 集成到 spring boot 中。感興趣的朋友跟隨小編一起看看吧
    2019-05-05
  • Java使用Log4j記錄日志的方法詳解

    Java使用Log4j記錄日志的方法詳解

    log4j是一個(gè)常用的日志框架,用于記錄應(yīng)用程序的執(zhí)行過(guò)程或異常等記錄在日志文件中。本文將利用Log4j記錄日志,感興趣的可以了解一下
    2022-03-03
  • JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn)

    JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn)

    這篇文章主要介紹了JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java實(shí)現(xiàn)二維碼生成的代碼方法

    Java實(shí)現(xiàn)二維碼生成的代碼方法

    這篇內(nèi)容分享了JAVA實(shí)現(xiàn)二維碼生成的實(shí)例代碼,對(duì)此有需要的朋友們可以測(cè)試參考下。
    2018-07-07
  • Java反射的使用和原理詳解

    Java反射的使用和原理詳解

    這篇文章主要介紹了Java反射的使用和原理詳解,反射是java語(yǔ)言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來(lái)進(jìn)行自我檢查并且對(duì)內(nèi)部的成員進(jìn)行操作,需要的朋友可以參考下
    2024-01-01
  • MyBatis不同Mapper文件引用resultMap實(shí)例代碼

    MyBatis不同Mapper文件引用resultMap實(shí)例代碼

    這篇文章主要介紹了mybatis 不同Mapper文件引用resultMap的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-07-07
  • SpringBoot對(duì)接Spark過(guò)程詳解

    SpringBoot對(duì)接Spark過(guò)程詳解

    這篇文章主要介紹SpringBoot接入Spark的方法的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望能幫助大家解決問(wèn)題
    2023-02-02
  • Java實(shí)現(xiàn)將彩色PDF轉(zhuǎn)為灰度PDF的示例代碼

    Java實(shí)現(xiàn)將彩色PDF轉(zhuǎn)為灰度PDF的示例代碼

    本文以Java代碼為例介紹如何實(shí)現(xiàn)將彩色PDF文件轉(zhuǎn)為灰度(黑白)的PDF文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-03-03
  • Java實(shí)現(xiàn)撲克牌洗牌和發(fā)牌

    Java實(shí)現(xiàn)撲克牌洗牌和發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)撲克牌洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 2022年最新java?8?(?jdk1.8u321)安裝圖文教程

    2022年最新java?8?(?jdk1.8u321)安裝圖文教程

    這篇文章主要介紹了2022年最新java?8?(?jdk1.8u321)安裝圖文教程,截止2022年1月,官方出的jdk1.8目前已更新到8u321的版本,本文通過(guò)圖文并茂的形式給大家介紹安裝過(guò)程,需要的朋友可以參考下
    2022-08-08

最新評(píng)論