当前位置: 首页 > news >正文

7.15做题记录(1)

T1

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

你必须编写一个具有 O(log n) 时间复杂度的算法。

示例 1:

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

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

最终答案

int search(int* nums, int numsSize, int target) {
    int i=0;
    while (nums[i]<target&&i<numsSize-1) i++;
    if(nums[i]==target) return i;  
    else return -1;
}

int search(int* nums, int numsSize, int target) {

int i=0;

while (nums[i]<target&&i<numsSize-1) i++;

if(nums[i]==target) return i;

else return -1;

}

思路

非常自然地想到从头开始将数组的每一个元素与target对比,相等时返回下标

历程

  1. 看漏了不存在返回下标的情况导致过不了相应的样例
  2. 没有看到已经给出的numsSize(数组的长度)试图通过*nums[i+1]!=NULL 来判断i有没有越界可惜至少C语言中数组末尾元素的下一个指针未必是NULL,并且长度不大于i的话nums[i+1]这种写法直接就错了
  3. 经典忘记了数组从0开始,纯用脑想没有理清判断条件的表达式到底该怎么写,几乎放弃思考不过就-1这样弄出来了......(丑陋)

总结

  1. 这个故事告诉我们要认真读题先确认好要考虑的情况,并且明确有哪些已知的东西
  2. C语言中如果位置数组长度需要用函数来获取
  • (静态) int len = sizeof(arr)/sizeof(arr[0])
    • arr为数组名
    • sizeof()得到占用的字节数,除以单个元素占用的字节数及得元素个数

反转!

经过D老师的提醒此处复杂度为O(n)而没到题目要求的O(log n),拙劣的笔者因为对不清楚复杂度并且自己不熟二分查找而忽略了题目的提示

  • 由于确实不熟又已经看过D老师的代码,这里只总结学到的东西)
  1. int型的除法只保留整数(天呐虽然是在复健但没想到这个都忘了)
  2. (来自D老师)
// 假设 left = 2,000,000,000, right = 2,000,000,000
int mid = (left + right) / 2;  
// left + right = 4,000,000,000 超过了 int 的范围(21亿多)
// 💥 溢出!结果是负数或错误值// 安全的写法:
int mid = left + (right - left) / 2;
// right - left = 0, 不会溢出

真·最终答案

(仍然来自D老师)

int search(int* nums, int numsSize, int target) {int left = 0, right = numsSize - 1;while (left <= right) {int mid = left + (right - left) / 2;  // 防止溢出if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}

真·总结

  • 感到(重新?)学习编程任重道远,现在娱乐大家,争取以后启发大家
  • 考虑到这里的二分查找需要已知数据是顺序排列的,在这个时候使用二分查找显然比线性查找更优,但是对于位置顺序的序列考虑到排序所需的复杂度其实线性查找复杂度更低
  • 对算法的理解还是需要从实践中产生,笔者已经严肃反思过去眼不高手低的作风,至少弄清楚基础的东西()
http://www.jsqmd.com/news/1196294/

相关文章:

  • 2026年7月最新重庆浪琴官方售后客户服务电话及线下网点地址 - 浪琴服务中心
  • TUSB8044 USB 3.1集线器寄存器配置实战:从原理到扩展坞设计
  • 2026年酸性清洗剂品牌厂商选型实用参考指南 - 热点品牌推荐
  • 2026年河北课程防工具适配本地需求选购指南 - 热点品牌推荐
  • 商城网站搭建平台哪个好,微商城和PC商城到底哪里不同
  • AI 指标异常根因分析:多维度关联比人工穷举快在哪
  • 船用割渔网刀具生产厂家选型采购及场景适配实用指南 - 热点品牌推荐
  • CBCX怎么样?一次围绕服务边界说明的理性复盘
  • C加加设计模式应用实战方法
  • 戴尔G15笔记本不开机故障维修:从待机电路到芯片级修复实战
  • Cesium OGC- wms服务教程
  • C++集群聊天服务器异常退出防御:从信号处理到分布式一致性的工程实践
  • 2025数据工程师核心能力:可信、可溯、可控的数据系统构建
  • Rust深度学习绑定:安全接入PyTorch与ONNX的工程实践
  • LeetCode的单调栈与单调队列
  • 2026最新语言转文字选择建议 | 口碑筛选的实用工具清单
  • AI图像生成与角色建模:从Stable Diffusion到ComfyUI的完整实践指南
  • 社交应用约会功能开发:Spring Boot与Vue.js全栈实现指南
  • 游戏工具链开发关卡编辑器与资源管道
  • Python零基础入门:从环境搭建到实战项目的完整学习指南
  • [Bug已解决] AOTInductor 在 CUDA 上 int64 上界越界(DISABLED test_upper_bound_i64_cuda)解决方案
  • 及时做APP开发实战(六)-番茄钟进度条动态基准实现
  • Halcon卡尺测量:从基础算子到Metrology模块的工业实践
  • 找靠谱船用割渔网刀具源头厂家 海事配件行业实用选型参考 - 热点品牌推荐
  • 2026年7月最新亨得利官方服务项目及价格查询|完整地址与24小时热线权威信息通告 - 亨得利官方博客
  • 找靠谱聚酰棒供应商实用选型选购指南 - 热点品牌推荐
  • 从理论到实践:双闭环直流调速系统PI参数整定与Simulink仿真验证
  • 可灵AI视频生成提示词工程:结构化公式与实战案例详解
  • 2026 年咸宁正规的乙酸乙酯回收工厂哪家好,别让废液白流:这招让乙酸乙酯回收变现 - 品质体验官
  • 数字电路硬件设计系列(二十七)之RTC电源与低功耗设计实战