[leetcode] 29. 两数相除

文章目录

  • 题目描述
  • 解题方法
    • 倍增
      • java代码
      • 复杂度分析

题目描述

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8-2.7335 将被截断至 -2

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:

  • -231 <= dividend, divisor <= 231 - 1
  • divisor != 0

解题方法

倍增

按照 a a a b b b 都是正数的情况说明。我们设 x × b < = a x \times b<=a x×b<=a 2 × x × b > a 2 \times x \times b>a 2×x×b>a,如果求 k × b = a k \times b = a k×b=a,那么 k k k 一定满足 x < = k < 2 x x <= k < 2x x<=k<2x

按照 d i v i d e n d dividend dividend d i v i s o r divisor divisor 都是正数的情况说明。我们可以利用上面的方式不断对 d i v i s o r divisor divisor 倍增,同时记录倍增数 m u l mul mul m u l mul mul 即为 k k k,初始为1),当 d i v i d e n d − m u l × d i v i s o r < m u l × d i v i s o r dividend− mul \times divisor < mul \times divisor dividendmul×divisor<mul×divisor时, d i v i d e n d = d i v i d e n d − m u l × d i v i s o r dividend = dividend− mul \times divisor dividend=dividendmul×divisor,答案追加 m u l mul mul。然后重复利用上面的方式计算倍增数 m u l mul mul d i v i d e n d dividend dividend 不断缩小,答案追加 m u l mul mul。直到 d i v i d e n d < d i v i s o r dividend < divisor dividend<divisor 时,即求出最终结果。

由于负数的表示范围更大,可以将 d i v i d e n d dividend dividend d i v i s o r divisor divisor 转化为负数,再利用倍增的思想计算结果。具体代码如下。

java代码

public int divide(int dividend, int divisor) {if (dividend == Integer.MIN_VALUE && divisor == -1) {return Integer.MAX_VALUE;}// 记录结果正负boolean flag = (dividend < 0) ^ (divisor < 0);// 将a和b设置为负数,a和b符号相同时方便辗转相减(如果设置为正数,dividend或divisor有一方是Integer.MIN_VALUE时,a或b转化为正数会越界)int a = (dividend < 0) ? dividend : -dividend;int b = (divisor < 0) ? divisor : -divisor;//记录结果int result = 0;// a > b时,a / b = 0while (a <= b) {// 记录倍增倍数int mul = 1;// 用temp临时记录bint temp = b;// 当temp + temp >= a时,mul倍增,temp倍增(之所以用减法是因为temp相加可能会超过整形范围)while (a - temp <= temp) {mul += mul;temp += temp;}// a减去倍增后的temp,剩余的a再与b相除a -= temp;result += mul;}return flag ? -result : result;
}

复杂度分析

时间复杂度: O ( l o g 2 N ) O(log^2N) O(log2N),其中 N N N 表示 32 位整数的范围。最坏情况系下倍增的次数为 O ( l o g N ) O(logN) O(logN) + O ( l o g N 2 ) O(log\frac {N} {2}) O(log2N) + O ( l o g N 4 ) O(log\frac {N} {4}) O(log4N) + …… + O ( l o g N N ) O(log\frac {N} {N}) O(logNN),故渐进复杂度为 O ( l o g 2 N ) O(log^2N) O(log2N)
空间复杂度: O ( 1 ) O(1) O(1)


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏

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

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

相关文章

惟客数据地产经营分析解决方案-构建数字化经营体系,提高精细化管理能力

惟客数据地产经营分析解决方案以拉通数据底座&#xff0c;以管理行为、量化考核、预警机制为核心&#xff0c;强化对经营风险的识别和解决&#xff0c;以终为始&#xff0c;通过高频高价值场景的应用适配&#xff0c;支撑企业在数字化时代中不断创新、转型&#xff0c;提升企业…

【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题

文章目录 &#x1f354;Redis的分布式锁&#x1f6f8;误删问题&#x1f388;解决方法&#x1f50e;代码实现 &#x1f6f8;原子性问题&#x1f339;Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁&#x1f50e;代码实现 &#x1f354;Redis的分布式锁 Redis的分布式锁是通过利…

如何加强项目团队的凝聚力?

随着时代的前行&#xff0c;越来越多的管理者意识到&#xff1a;如今的职场不一样了。人才的话语权和自主权&#xff0c;远比工业时代产线上的工人来得大。只要他们足够优秀&#xff0c;就有足够好的平台供他们挑选。 要想争取他们的加入&#xff0c;企业就需要提供优质的平台…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示&#xff1a; 可以看到题目提示为&#xff1a; 密钥什么的&#xff0c;就不要放在前端了 然后我们打开题目链接&#xff1a; 然后我们查看网页源代码&#xff1a; 可以发现有用的内容全在网页源代码里。 前端验证…

数据结构——C/栈和队列

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特…

泛型、Trait 和生命周期(上)

目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型&#xff08;generics&#xff09;。泛型是具体类型…

51单片机基础:定时器

1.定时器介绍 51单片机通常有两个定时器&#xff1a;定时器 0/1&#xff0c;好一点的可能有定时器3。 在介绍定时器之前我们先科普下几个知识&#xff1a; 1&#xff0c;CPU 时序的有关知识 ①振荡周期&#xff1a;为单片机提供定时信号的振荡源的周期&#xff08;晶振周期或…

新年快乐,我们一起GOGOGO!

1. 为什么要安装Go&#xff1f; 工欲善其事必先利其器&#xff0c;通俗来讲&#xff0c;要想保留雪糕&#xff0c;那就必须把雪糕放在"冷"的环境。这其实是一个道理&#xff0c;相关其他编程语言&#xff0c;例如Java&#xff0c;它就需要安装Java的开发环境JDK。 …

有趣的CSS - 多彩变化的按钮

目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 这个按钮效果主要使用 :hover 、:active 伪选择器以及 animation 、transition 属性来让背景色循环快速移动形成视觉效果。 核心代码部分&#xff0c;简要说明了写法思路&…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时&#xff0c;想在DevEco Studio导入官方示例代码&#xff1a;待办列表&#xff08;ArkTS&#xff09;报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

Mac上新版InfluxDB使用教程

一、简介 官网&#xff1a;influxdb 二、influxdb安装 建议使用Homebrew在 macOS 上安装 InfluxDB v2&#xff1a; brew install influxdb启动influxdb服务&#xff1a;brew services start influxdb 停止influxdb服务&#xff1a;brew services stop influxdb 查看是否启…

React+Antd+tree实现树多选功能(选中项受控+支持模糊检索)

1、先上效果 树型控件&#xff0c;选中项形成一棵新的树&#xff0c;若父选中&#xff0c;子自动选中&#xff0c;子取消&#xff0c;父不取消&#xff0c;子选中&#xff0c;所有的父节点自动取消。同时支持模糊检索&#xff0c;会检索出所有包含该内容的关联节点。 2、环境准…