【二分法查找】

使用二分法查找需要注意的点:

使用二分法的前提: 数组为有序数组,同时题目还强调数组中无重复元素。

二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

力扣:704. 二分查找 (标准的二分查找)

题目: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,nums 中的所有元素是不重复的。写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

解题思路: 标准的二分法查找解题。如下使用的是左闭右闭区间解题[left, right]

<<:二进制左移;左移一位相当于乘2; >>:二进制右移;右移一位相当于除2(不完全等同),比除法快
left + ((right - left) >> 1) 等同于(left + right)/2 ,可防止溢出

解答:

class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;if (target < nums[left] || target > nums[right]) {return -1;}while (left <= right) {int mindle = left + ((right - left) >> 1);// 防止溢出 等同于(left + right)/2if (target < nums[mindle]) {right = mindle - 1;} else if (target > nums[mindle]) {left = mindle + 1;} else {return mindle;}}return -1;}
}

力扣35. 搜索插入位置(需分析清楚数组中插入值都有哪几种情况)

题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。

示例一:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例二:
输入: nums = [1,3,5,6], target = 2
输出: 1

解题思路: 要在数组中插入目标值,无非是这四种情况。

  • 目标值在数组所有元素之前
  • 目标值等于数组中某一个元素
  • 目标值插入数组中的位置
  • 目标值在数组所有元素之后
class Solution {public int searchInsert(int[] nums, int target) {int n = nums.size();int left = 0;int right = n - 1; // 定义target在左闭右闭的区间里,[left, right]while (left <= right) { // 当left==right,区间[left, right]依然有效int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2if (nums[middle] > target) {right = middle - 1; // target 在左区间,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,所以[middle + 1, right]} else { // nums[middle] == targetreturn middle;}}// 分别处理如下四种情况// 目标值在数组所有元素之前  [0, -1]// 目标值等于数组中某一个元素  return middle;// 目标值插入数组中的位置 [left, right],return  right + 1// 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1return right + 1;//在找不到的情况下,右边界处于一个偏小的状态,target就是右边界+1}
}

力扣69:X的平方根

题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。0 <= x <= 231 - 1

示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。

解题思路: 把获取x的算术平方根,看成从0到x这个整数数组中获取x的算术平方根,这样就可以用二分法解题了。

class Solution {public int mySqrt(int x) {if(x == 0 || x == 1){return x;}int left = 1,right = x / 2;int sqrt = 0;while (left <= right) {int mindle = left + ((right - left) >> 1);if(mindle > x / mindle) {right = mindle - 1;} else {left = mindle + 1;sqrt = left;}}return sqrt - 1;}
}

力扣367:有效的完全平方数

题目: 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。1 <= num <= 231 - 1

完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。

不能使用任何内置的库函数,如 sqrt 。

示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742不是一个整数。

解题思路: 可以把寻找num的完全平方数 转化为在一个[0-num]的正整数数组中寻找。PS:在做该题时,一开始参数类型是int,但是提交的时候有个测试用例无法通过(输入num=808201),将类型都改为long后,代码即可提交成功

class Solution {public boolean isPerfectSquare(int num) {long left = 0,right = num -1;if (num == 1) {return true;}while(left <= right){long mindle = left + ((right - left) / 2);if(mindle * mindle == num){return true;} else if (mindle * mindle > num){right = mindle - 1;} else {left = mindle + 1;}}return false;}
}

2、乘法溢出

乘法溢出是指在计算机中,两个数的乘积的结果超出了当前有效位数的范围时出现的一种现象。乘法溢出发生在有限位数表示法下,当一个数作为乘数与另一个数相乘时,可能会出现结果值超出所采用的有限位数表示法的范围。

例如,在8位有符号补码表示法中,最大的正数是127,最小的负数是-128。当其中一个数的绝对值大于127,或者一个正数乘以一个负数时,结果就可能会超出8位有符号补码表示法的范围,从而发生乘法溢出。”

数学知识:计算只包含乘法加法减法的表达式时,对表达式除余,可以对每步计算除余,结果是不变的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua多脚本执行

--全局变量 a 1 b "123"for i 1,2 doc "Holens" endprint(c) print("*************************************1")--本地变量&#xff08;局部变量&#xff09; for i 1,2 dolocal d "Holens2"print(d) end print(d)function F1( ..…

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…

springcloudgateway Actuator API

官方文档&#xff1a;11. Actuator API 开启actuator 加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 加配置 management:endpoints:web:expos…

git学习使用

git使用 1、cmd #查看版本 git version2、初识 Git GUI: Git提供的图形界面工具 Git Bash: Git提供的命令行工具 1.打开Git Bash2.设置自己的用户名和邮箱地址git config --global user.name "xxx"git config --global user.email "123456789163.com"查…

基于jenkins+k8s实现devops

1、背景 由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程&#xff0c;亲测无坑 2、部署 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml apiVersion: v1 kind: ServiceAccount metadata:name: jenkinsnamespace…

OpenHarmony应用程序包整体说明

用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 OpenHarmony提供了应用程序包开发、安装、查询、更新、卸载的管理机制&#xff0c;方便开发者开发和管…

Vue安装插件时候中遇到冲突依赖解决方案

错误如下&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin-vue npm ERR! dev eslint-pl…

word中给公式加序号的方法

①首先&#xff0c;用word插入一个公式 然后呢&#xff0c;在公式后面敲上这个公式在整篇文章中的序号。我的这个公式在整篇文章中是第三号&#xff0c;所以就敲上(3),如下图所示&#xff1a; 然后&#xff0c;在公式和序号之间&#xff0c;按住shift3(#) 切忌&#xff0c;…

UNITY—2D游戏制作入门!

Unity作为当今最流行的游戏引擎之一&#xff0c;受到各大厂商的喜爱。 像是炉石传说&#xff0c;以及逃离塔克夫&#xff0c;都是由unity引擎开发制作。 作为初学者的我们&#xff0c;虽然无法直接做出完成度那么高的作品&#xff0c;但每一个伟大的目标&#xff0c;都有一个…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…

软件测试一些常见的误区

摘要 随着市场对软件质量的不断提高&#xff0c;软件测试不断受到重视&#xff0c;但是由于总体上&#xff0c;国内软件项目过程不规范&#xff0c;导致重视编码和轻视测试的现象&#xff0c;对于软件测试的重要性、测试方法和流程等还存在很多错误的认识。根据作者的软件工作…

绘制lidar点云pose

输入点云序列&#xff0c;得到点云的运动轨迹&#xff0c;并生成周围点云拼接得到的点云地图 #include <rclcpp/rclcpp.hpp> #include <sensor_msgs/msg/point_cloud2.hpp> #include <geometry_msgs/msg/transform_stamped.hpp> #include <pcl/point_clo…

(数组/字符串) 380. O(1) 时间插入、删除和获取随机元素 ——【Leetcode每日一题】

❓ 380. O(1) 时间插入、删除和获取随机元素 难度&#xff1a;中等 实现 RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#x…

Fortran IMSL库申请学生许可安装

最近使用IMSL想求个定积分&#xff0c;发现之前用的imsl7.0不支持&#xff0c;会说明许可证已经过期&#xff0c;不得不自己申请一个许可。 首先是之前的blog&#xff1a;VS2022 Fortran 配置IMSL库 这次自己申请了一个学生许可证&#xff0c;大致需要学校邮箱&#xff0c;学…

YUM 升级 PHP7

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址&#xff1a;网站地址 参考地址&#xff1a;网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

(c语言)数组的排序插入和删除

#include<stdio.h> void PaiXu(int arr[11]) //排序 { int i, j 0; for (i 0; i < 10; i) { for (j 0; j < 10 - i-1; j) { if (arr[j] > arr[j 1]) { int t arr[j]; …

python经典百题之static定义静态变量的方法

题目: 学习 static 定义静态变量 程序分析 在Python中&#xff0c;“static”&#xff08;静态变量&#xff09;的概念通常与类的属性相关联。虽然Python没有严格的静态变量概念&#xff0c;但可以通过类属性或模块级变量来模拟静态变量的功能。我们将探讨三种不同的方法来模…

Kafka-UI

有多款kafka管理应用&#xff0c;目前选择的是github上star最多的UI for Apache Kafka。 关于 To run UI for Apache Kafka, you can use either a pre-built Docker image or build it (or a jar file) yourself. UI for Apache Kafka is a versatile, fast, and lightweight…

工作中Git管理项目和常见问题处理

工作中Git管理项目和常见问题处理 Git仓库的管理方式为什么会出现无法push到线上处理方法 Git仓库的管理方式 共用统一仓库,不同开发人员使用不同分支 步骤 下载代码 git clone <url>查看分支 git branch创建并切换分支 git checkout -b dev分支名称保持和远程分支一…

代码随想录算法训练营第五十天 | 123.买卖股票的最佳时机III 188. 买卖股票的最佳时机 IV

1. 买卖股票的最佳时机 III 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; * 定义 5 种状态: * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出 class Solution {public int maxProfit(int[] prices) {int length prices.l…