剑指 Offer 53 - II. 0~n-1中缺失的数字(二分法)

寻找有序数组中的缺失数:遍历与二分法
本文探讨了两种查找有序数组中缺失数的方法:遍历实现的时间复杂度为O(n),适用于简单场景;而二分查找法在有序数组中效率更高,时间复杂度为O(logn),适用于大规模数据。两种方法的区别与适用场景分析详尽。

在这里插入图片描述

解法一:遍历

int missingNumber(int* nums, int numsSize){
   
   
    for(int i=0; i<numsSize; i++)
    {
   
   
根据您提供的反馈,程序最终输出的$c$值为`-0.000`,这表明二分法在最后一次迭代时计算得到的函数值$f(x)$非常接近于零,但由于浮点数的精度问题,可能并未完全等于零。下面是一些建议和修正方案: ### 代码概述 代码使用了二分法查找算法来求解五次方程 $x^5 - 300.4 = 0$ 的近似解。 ### 代码解析 1. **代码逻辑**: - 使用`while`循环,当误差$c$大于设定的精度$1e-4$时继续迭代。 - 计算中间值$x=(a+b)/2.0$。 - 根据$f(x)$的符号更新区间端点$a$或$b$。 - 最后输出求得的$x$和此时的$c$值。 2. **问题分析**: - **浮点数精度问题**:由于计算机浮点数表示的局限性,即使$c$非常小,也可能不会精确为零。 - **输出格式**:当前的输出格式为`%.3f`,这会将非常小的负数显示为`-0.000`。 - **重复计算**:`if (f(x)>0)b=x;` 和 `if (f(x)<0) a=x;` 中两次调用`f(x)`,效率低。 - **`c=f(x)`的位置**:应放在`if`语句之前,以避免重复计算。 3. **修正建议**: - 修改输出格式为`%.4f`或更高精度,以更精确地显示$c$值。 - 将`c=f(x)`放在`if`语句之前,避免重复计算。 - 考虑将终止条件改为检查区间长度$(b-a)$是否小于某个阈值,例如`1e-4`。 ### 修改后的代码 ```c #include <stdio.h> #include <math.h> double f(double x) { return pow(x, 5) - 300.4; } int main() { double a = 0.0, b = 10000.0, x, c; while (fabs(b - a) > 1e-4) { x = (a + b) / 2.0; c = f(x); if (c > 0) { b = x; } else if (c < 0) { a = x; } } printf("%.4f %.4f\n", x, c); return 0; } ``` ### 知识点 - **二分法原理**:通过不断缩小解所在的区间,逐步逼近精确解。 - **浮点数精度**:了解浮点数在计算机中的表示方法及其带来的误差。 - **C语言语法**:包括函数定义、条件语句、循环结构等基本语法元素。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值