[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 = 0
    while (a <= b) {
        // 记录倍增倍数
        int mul = 1;
        // 用temp临时记录b
        int 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)


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

得物自研API网关实践之路

一、业务背景 老网关使用 Spring Cloud Gateway &#xff08;下称SCG&#xff09;技术框架搭建&#xff0c;SCG基于webflux 编程范式&#xff0c;webflux是一种响应式编程理念&#xff0c;响应式编程对于提升系统吞吐率和性能有很大帮助; webflux 的底层构建在netty之上性能表…

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

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

【C语言】socket函数

一、socket函数函数的原型 int socket(int domain, int type, int protocol); 其中&#xff1a; domain参数指定套接字应该使用的协议族&#xff08;例如&#xff0c;AF_INET表示IPv4协议族&#xff09;。type参数指定套接字类型&#xff08;例如&#xff0c;SOCK_STREAM表示…

阿里云游戏服务器多少钱一个月?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

MATLAB语音去噪系统

目录 一、背景 二、GUI页面 三、程序 3.1 LMS滤波程序 3.2 GUI程序 四、附录 一、背景 本文介绍了一种最佳的自适应滤波器结构&#xff0c;该结构采用最小均方差&#xff08;LMS&#xff09;作为判据&#xff0c;通过不断迭代自适应结构来调整得到最佳滤波器…

Godot 游戏引擎个人评价和2024年规划(无代码)

文章目录 前言Godot C# .net core 开发简单评价Godot相关网址可行性 Godot(GDScirpt) Vs CocosGodot VS UnityUnity 的裁员Unity的股票Unity的历史遗留问题&#xff1a;Mono和.net core.net core的开发者&#xff0c;微软 个人的独立游戏Steam平台分成说明独立游戏的选题美术风…

Win32 SDK Gui编程系列之--ListView自绘OwnerDraw

ListView自绘OwnerDraw 1.ListView自绘OwnerDraw 正在试错是否使用了列表视图,尽量制作出智能的表格编辑器。本页显示了业主抽签的表格数据(二维数组数据)的显示方法。 显示画面和整个程序如下所示。使用ListView_GetSubItemRect宏的话,就不需要getRect函数了。 当nCol的…

归并排序(Java)

归并排序是常见的八大排序算法之一&#xff0c;归并排序也是一种时间复杂度比较好的一种算法&#xff0c;为0(n*logn)级别。 归并排序可以用递归和非递归两种方式来实现&#xff0c;当然&#xff0c;递归方法是比较简单的&#xff0c;而非递归则是相对而言比较难的一种思路。 归…

使用 NtQuerySystemInformation 遍历进程信息

在 Windows 操作系统中&#xff0c;了解正在运行的进程的信息对于系统管理和性能优化至关重要。通过遍历系统进程信息&#xff0c;我们可以获取进程的 ID、名称、线程数、句柄数以及各种性能指标&#xff0c;从而帮助我们了解系统的运行状况并进行必要的调整和优化。本文将详细…

python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…

新版MQL语言程序设计:键盘快捷键交易的设计与实现

文章目录 一、什么是快捷键交易二、使用快捷键交易的好处三、键盘快捷键交易程序设计思路四、键盘快捷键交易程序具体实现1.界面设计2.键盘交易事件机制的代码实现 一、什么是快捷键交易 操盘中按快捷键交易是指在股票或期货交易中&#xff0c;通过使用快捷键来进行交易操作的…

故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab) 模型描述 时间卷积神经网络(TCN)是一种用于序列数据建模和预测的深度学习模型。它通过卷积操作在时间维度上对序列数据进行特征提取,并且可以处理可变长度的输入序列。 要使用TCN进行…

昆仑万维发布天工 2.0 大语言模型及AI助手App;AI成功破解2000年前碳化古卷轴

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布天工 2.0 大语言模型及AI助手App 摘要&#xff1a;昆仑万维近日推出了新版MoE大语言模型“天工 2.0”和相应的“天工 AI 智能助手”App&#xff0c;宣称为国内首个面向C端用户免费的基于MoE架构的千亿级参数大模型应用。天工…

购物车底部工具栏全选、总价、总数量实现

购物车商品加一个checked属性 定义allChecked属性 <!-- 底部工具栏 开始 --> <view class"footer_tool"><!-- 全选 开始 --><view class"all_chk_wrap"><checkbox-group><checkbox checked"{{allChecked}}">…

视频上传 - 断点续传那点事

在上一篇文章中&#xff0c;我们讲解了分片上传的实现方式。在讲解断点续传之前&#xff0c;我要把上篇文章中留下的问题讲解一下。读过上一篇文章的小伙伴们都知道&#xff0c;对于分片上传来说&#xff0c;它的传输方式分为2种&#xff0c;一种是按顺序传输&#xff0c;一种是…

如何安装x11vnc并结合cpolar实现win远程桌面Deepin

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

机器学习系列——(十六)回归模型的评估

引言 在机器学习领域&#xff0c;回归模型是一种预测连续数值输出的重要工具。无论是预测房价、股票价格还是天气温度&#xff0c;回归模型都扮演着不可或缺的角色。然而&#xff0c;构建模型只是第一步&#xff0c;评估模型的性能是确保模型准确性和泛化能力的关键环节。本文…

微信小程序解决华为手机保存图片到相册失败

1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…

github使用问题汇总

1. Permission denied 1.1. 问题描述 Permission denied (publickey). fatal: Could not read from remote repository. 1.2. 解决方法 生成公钥 ssh-keygen -t ed25519 -C "your_emailexample.com" 点击回车三次 Generating public/private ed25519 key pair. …