Java二分查找算法与数组处理的应用实例
作者:风铃听雨~ 发布时间:2022-07-11 01:26:57
标签:Java,二分查找,数组
1.特殊数组的特征值
题目描述
思路详解
看到本题,首先思考需要排序,然后查找,这里为了效率采用二分查找。
假设定义x=(left+riht)/ 2,每次查找到nums中第一个大于等于X的元素下标,判断大于等于X的个数与X的关系,进行分情况修改左右边界。
代码与结果
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天内送达包裹的能力
题目描述
思路详解
假设当船的运载能力为 x 时,我们可以在days 天内运送完所有包裹,那么只要运载能力大于 x,我们同样可以在 days 天内运送完所有包裹:我们只需要使用运载能力为 x时的运送方法即可。
由于必须按照数组weights 中包裹的顺序进行运送,因此我们从数组 weights 的首元素开始遍历,将连续的包裹都安排在同一天进行运送。当这批包裹的重量大于运载能力 x 时,我们就需要将最后一个包裹拿出来,安排在新的一天,并继续往下遍历。当我们遍历完整个数组后,就得到了最少需要运送的天数。
代码与结果
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 为需要运送的天数
// cur 为当前这一天已经运送的包裹重量之和
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.咒语和药水的成功对数
题目描述
思路详解
本题采用二分查找的方法进行解题。
首先我们对药水的数组进行排序,其次我们遍历咒术数组,利用二分查找的思想在药水数组中查找,与成功值最接近的数值,存入到答案数组中。
有个小细节,判断时候1l * power * potions[mid] < success 这样做是为了把数字转化为long型,避免错误哦。
代码与结果
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;
}
}
来源:https://blog.csdn.net/muzi_longren/article/details/125735530


猜你喜欢
- 各位亲们可以尝试以下代码:注:这里我就只有一个html标签对来说明问题了,首部之类的东西,自己添加。<html> &n
- 本文主要讨论C#开发使用百度语音合成API在线将文本内容合成语音,保存为 MP3 文件,本文最后会提供本安全源代码以及运行软件包,
- 如何配置swagger?在使用项目中,我们希望去查看我们的webapi的测试,那么我们是需要去有一个集成的测试的。步骤1.在nutget管理
- 效果展示在实际项目当中我们经常看到如下各种剪裁形状的效果,Flutter 为我们提供了非常方便的 Widget 很轻松就可以实现,下面我们来
- 最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看flyme6的Viewpager指示器,觉得有点意思,就模仿写了一下,整体效
- @ConfigurationProperties加载外部配置@ConfigurationProperties可以将外部配置文件(比如appl
- 1、背景一般情况下,有些搜索需求是需要根据拼音和中文来搜索的,那么在elasticsearch中是如何来实现基于拼音来搜索的呢?可以通过el
- 23种设计模式第四篇:java单例模式定义: 单例模式,
- 本文实例为大家分享了Android刮刮卡效果控件,供大家参考,具体内容如下刮刮卡类: package com.reyo.view;impor
- 目录前言步入正题类的加载过程:1.加载2.验证3.准备4.解析5.初始化类加载器源码总结前言学生时代应抱着问题去学习一门语言,例如:在学习j
- 我们都知道单精度浮点数(Single,float,Real)由32位0或1组成,它具体是如何来的。浮点数的32位N=1符号位(Sign)+8
- 用来记录自己所用到的知识前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了
- 本文实例讲述了Android+SQLite数据库实现的生词记事本功能。分享给大家供大家参考,具体如下:主activity命名为Dict:代码
- 本文实例讲述了Android编程之canvas绘制各种图形的方法。分享给大家供大家参考,具体如下:1、首先说一下canvas类:Class
- 一 概述DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集-》新数据集的最小变化量。 说
- 效果:说明:获取本局域网的MAC地址(非本机的MAC地址)代码:/// <summary>
- SpringMVC AbstractAnnotationConfigDispatcherSerServlet3.0环境中,容器会在类路径中查
- 相信最近看过我的文章的朋友对于Microsoft.Extensions.ObjectPool不陌生;复用、池化是在很多高性能场景的优化技巧,
- XuLIeHua类库using System;using System.Collections; using System.Co
- SpringBoot实践,开发社区登录模块今日份开启 发送邮件三个步骤:1、邮箱设置首先需要注册一个新浪邮箱 18215626061@sin