Java二分查找算法與數(shù)組處理的應(yīng)用實例
1.特殊數(shù)組的特征值
題目描述

思路詳解
看到本題,首先思考需要排序,然后查找,這里為了效率采用二分查找。
假設(shè)定義x=(left+riht)/ 2,每次查找到nums中第一個大于等于X的元素下標(biāo),判斷大于等于X的個數(shù)與X的關(guā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)船的運載能力為 x 時,我們可以在days 天內(nèi)運送完所有包裹,那么只要運載能力大于 x,我們同樣可以在 days 天內(nèi)運送完所有包裹:我們只需要使用運載能力為 x時的運送方法即可。
由于必須按照數(shù)組weights 中包裹的順序進行運送,因此我們從數(shù)組 weights 的首元素開始遍歷,將連續(xù)的包裹都安排在同一天進行運送。當(dāng)這批包裹的重量大于運載能力 x 時,我們就需要將最后一個包裹拿出來,安排在新的一天,并繼續(xù)往下遍歷。當(dāng)我們遍歷完整個數(shù)組后,就得到了最少需要運送的天數(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 為需要運送的天數(shù)
// cur 為當(dāng)前這一天已經(jīng)運送的包裹重量之和
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ù)
題目描述

思路詳解
本題采用二分查找的方法進行解題。
首先我們對藥水的數(shù)組進行排序,其次我們遍歷咒術(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)用哦!?。?!
到此這篇關(guān)于Java二分查找算法與數(shù)組處理的應(yīng)用實例的文章就介紹到這了,更多相關(guān)Java二分查找與數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理
策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設(shè)計模式之策略模式,感興趣的朋友一起看看吧2017-08-08
java如何從地址串中解析提取省市區(qū)(完美匹配中國所有地址)
這篇文章主要給大家介紹了關(guān)于java如何從地址串中解析提取省市區(qū)的相關(guān)資料,通過這個方法可以完美匹配中國所有地址,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
IDEA的Web項目右鍵無法創(chuàng)建Servlet問題解決辦法
這篇文章主要介紹了IDEA的Web項目右鍵無法創(chuàng)建Servlet問題解決辦法的相關(guān)資料,在IDEA中新建Servlet時發(fā)現(xiàn)缺失選項,可以通過在pom.xml文件中添加servlet依賴解決,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
Spring Boot產(chǎn)生環(huán)形注入的解決方案
這篇文章主要介紹了Spring Boot產(chǎn)生環(huán)形注入的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SSM框架整合之Spring+SpringMVC+MyBatis實踐步驟
大家都知道Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細(xì)介紹,通過項目實踐步驟給大家詳細(xì)介紹,感興趣的朋友一起看看吧2021-06-06
詳解Java數(shù)組擴容縮容與拷貝的實現(xiàn)和原理
這篇文章主要帶大家學(xué)習(xí)數(shù)組的擴容、縮容及拷貝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
基于Java SSM框架實現(xiàn)簡易的評教系統(tǒng)
這篇文章主要介紹了通過Java SSM框架實現(xiàn)一個簡易的評教系統(tǒng)的示例代碼,文中的代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-02-02
JAVA中 redisTemplate 和 jedis的配合使用操作
這篇文章主要介紹了JAVA中 redisTemplate 和 jedis的配合使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

