Java二分查找算法與數(shù)組處理的應(yīng)用實例
1.特殊數(shù)組的特征值
題目描述
思路詳解
看到本題,首先思考需要排序,然后查找,這里為了效率采用二分查找。
假設(shè)定義x=(left+riht)/ 2,每次查找到nums中第一個大于等于X的元素下標(biāo),判斷大于等于X的個數(shù)與X的關(guān)系,進(jìn)行分情況修改左右邊界。
代碼與結(jié)果
class Solution { public int specialArray(int[] nums) { Arrays.sort(nums); int n = nums.length; int left = 0, right = n; while (left <= right) { int x = (left + right) >> 1; int idx = binarySearch(nums, x); // nums中第一個大于等于x的元素位置 if (x == n - idx) { return x; } else if (x < n - idx) { // 大于等于x的元素太多了,所以下一輪搜索要增大x的取值范圍 left = x + 1; } else { // 反之,減少x的取值范圍 right = x - 1; } } return -1; } private static int binarySearch(int[] nums, int x) { int left = 0, right = nums.length - 1; while (left <= right) { int mid = (left + right) >> 1; int val = nums[mid]; if (val >= x) { right = mid - 1; } else { left = mid + 1; } } return left; } }
2.在D天內(nèi)送達(dá)包裹的能力
題目描述
思路詳解
假設(shè)當(dāng)船的運(yùn)載能力為 x 時,我們可以在days 天內(nèi)運(yùn)送完所有包裹,那么只要運(yùn)載能力大于 x,我們同樣可以在 days 天內(nèi)運(yùn)送完所有包裹:我們只需要使用運(yùn)載能力為 x時的運(yùn)送方法即可。
由于必須按照數(shù)組weights 中包裹的順序進(jìn)行運(yùn)送,因此我們從數(shù)組 weights 的首元素開始遍歷,將連續(xù)的包裹都安排在同一天進(jìn)行運(yùn)送。當(dāng)這批包裹的重量大于運(yùn)載能力 x 時,我們就需要將最后一個包裹拿出來,安排在新的一天,并繼續(xù)往下遍歷。當(dāng)我們遍歷完整個數(shù)組后,就得到了最少需要運(yùn)送的天數(shù)。
代碼與結(jié)果
class Solution { public int shipWithinDays(int[] weights, int days) { // 確定二分查找左右邊界 int left = Arrays.stream(weights).max().getAsInt(), right = Arrays.stream(weights).sum(); while (left < right) { int mid = (left + right) / 2; // need 為需要運(yùn)送的天數(shù) // cur 為當(dāng)前這一天已經(jīng)運(yùn)送的包裹重量之和 int need = 1, cur = 0; for (int weight : weights) { if (cur + weight > mid) { ++need; cur = 0; } cur += weight; } if (need <= days) { right = mid; } else { left = mid + 1; } } return left; } }
3.咒語和藥水的成功對數(shù)
題目描述
思路詳解
本題采用二分查找的方法進(jìn)行解題。
首先我們對藥水的數(shù)組進(jìn)行排序,其次我們遍歷咒術(shù)數(shù)組,利用二分查找的思想在藥水?dāng)?shù)組中查找,與成功值最接近的數(shù)值,存入到答案數(shù)組中。
有個小細(xì)節(jié),判斷時候1l * power * potions[mid] < success 這樣做是為了把數(shù)字轉(zhuǎn)化為long型,避免錯誤哦。
代碼與結(jié)果
class Solution { public int[] successfulPairs(int[] spells, int[] potions, long success) { int[] ans = new int[spells.length]; Arrays.sort(potions); for (int i = 0; i < spells.length; i++) { int power = spells[i]; int left = 0; int right = potions.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (1l * power * potions[mid] < success) { left = mid + 1; } else { right = mid - 1; } } ans[i] = potions.length - left; } return ans; } }
總結(jié)
今天主要集中在二分查找的應(yīng)用,希望小伙伴通過今天的習(xí)題可以體驗到二分查找的好處,可以更加熟練的應(yīng)用哦!?。。?/p>
到此這篇關(guān)于Java二分查找算法與數(shù)組處理的應(yīng)用實例的文章就介紹到這了,更多相關(guān)Java二分查找與數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Fluent Mybatis 項目工程化與常規(guī)操作詳解流程篇 上
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強(qiáng)框架 fluent mybatis2021-10-10SpringCloud Alibaba微服務(wù)實戰(zhàn)之遠(yuǎn)程Feign請求頭丟失問題解決方案
這篇文章主要介紹了SpringCloud Alibaba微服務(wù)實戰(zhàn)之遠(yuǎn)程Feign請求頭丟失問題,對SpringCloud Alibaba Feign請求頭問題感興趣的朋友跟隨小編一起看看吧2024-02-02Java?CompletableFuture實現(xiàn)多線程異步編排
這篇文章主要為大家介紹了Java?CompletableFuture實現(xiàn)多線程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringBoot配置Profile實現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實現(xiàn)多環(huán)境支持操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java實現(xiàn)文件上傳到服務(wù)器本地并通過url訪問的方法步驟
最近項目中使用到了文件上傳到服務(wù)器的功能,下面這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)文件上傳到服務(wù)器本地并通過url訪問的方法步驟,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04基于SpringBoot核心原理(自動配置、事件驅(qū)動、Condition)
這篇文章主要介紹了基于SpringBoot核心原理(自動配置、事件驅(qū)動、Condition),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08