Python算法题集_搜索插入位置

Python算法题集_搜索插入位置

  • 题51:搜索插入位置
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【二分法查找】
    • 2) 改进版一【二分法查找+终止条件判断】
    • 3) 改进版二【第三方模块】
  • 4. 最优算法
  • 5. 相关资源

本文为Python算法题集之一的代码示例

题51:搜索插入位置

1. 示例说明

  • 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    请必须使用时间复杂度为 O(log n) 的算法。

    示例 1:

    输入: nums = [1,3,5,6], target = 5
    输出: 2
    

    示例 2:

    输入: nums = [1,3,5,6], target = 2
    输出: 1
    

    示例 3:

    输入: nums = [1,3,5,6], target = 7
    输出: 4
    

    提示:

    • 1 <= nums.length <= 104
    • -104 <= nums[i] <= 104
    • nums无重复元素升序 排列数组
    • -104 <= target <= 104

2. 题目解析

- 题意分解

  1. 本题是在已排序的整数数组中查找目标数字的插入位置
  2. 最快方式就是二分法

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 二分法中可以采用终止条件判断

    2. 可以考虑使用排序列表操作模块bisect

- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大【可把页面视为功能测试】,因此需要本地化测试解决数据波动问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题本地化超时测试用例自己生成,详见章节【最优算法】,代码文件包含在【相关资源】中

3. 代码展开

1) 标准求解【二分法查找】

通过二分法查找目标数值应插入位置

页面功能测试,性能一般,超过79%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def searchInsert_base(self, nums, target):ileft, iright = 0, len(nums)while ileft < iright:imid = (ileft + iright) // 2if nums[imid] >= target:iright = imidelse:ileft = imid + 1return ileftaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.searchInsert_base, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchInsert_base 的运行时间为 1.00 ms;内存使用量为 4.00 KB 执行结果 = 99999985

2) 改进版一【二分法查找+终止条件判断】

通过二分法查找目标数值应插入位置,检测中进行终止条件判断

页面功能测试,马马虎虎,超过35%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def searchInsert_ext1(self, nums, target):ileft, iright = 0, len(nums) - 1while ileft <= iright:imid = (iright - ileft) // 2 + ileftif target == nums[imid]:return imidif target < nums[imid]:iright = imid - 1else:ileft = imid + 1return ileftaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.searchInsert_ext1, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchInsert_ext1 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果 = 99999985

3) 改进版二【第三方模块】

使用排序列表操作模块bisect来查找插入位置

页面功能测试,马马虎虎,超过29%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def searchInsert_ext2(self, nums, target):from bisect import bisect_leftreturn bisect_left(nums, target)aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.searchInsert_ext2, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 searchInsert_ext2 的运行时间为 1.00 ms;内存使用量为 16.00 KB 执行结果 = 99999985

4. 最优算法

根据本地日志分析,最优算法为第2种方式【二分法查找+终止条件判断】searchInsert_ext1

本题测试数据,似乎能推出以下结论:

  1. 在排序数组上使用二分法查询,性能非常夸张,简直是瞬间定位【1亿的数组,1毫秒定位】
  2. 既然性能不是问题,那么可维护性越好越有利,推荐使用第三种解法
ilen  = 100000000
isize = ilen // 2
itarget = 0
while isize > 4:itarget += isizeisize = isize // 2
nums = [x for x in range(ilen)]
aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.searchInsert_base, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(aSolution.searchInsert_ext1, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(aSolution.searchInsert_ext2, nums, itarget)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 算法本地速度实测比较
函数 searchInsert_base 的运行时间为 1.00 ms;内存使用量为 4.00 KB 执行结果 = 99999985
函数 searchInsert_ext1 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果 = 99999985
函数 searchInsert_ext2 的运行时间为 1.00 ms;内存使用量为 16.00 KB 执行结果 = 99999985

5. 相关资源

本文代码已上传到CSDN,地址:Python算法题源代码_LeetCode(力扣)_搜索插入位置

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】栈和队列

目录 1 -> 栈 1.1 -> 栈的概念及结构 1.2 -> 栈的实现 1.2.1 -> Stack.h 1.2.2 -> Stack.c 1.2.3 -> Test.c 2 -> 队列 2.1 -> 队列的概念及结构 2.2 -> 队列的实现 2.2.1 -> Queue.h 2.2.2 -> Queue.c 1 -> 栈 1.1 -> 栈的…

HTML5+CSS3+JS小实例:灵动的流边开关切换效果

实例:灵动的流边开关切换效果 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, in…

mysql8安装配置(最新版)

目录 一、下载mysql8 二、安装mysql8 三、配置mysql 一、下载mysql8 下载链接&#xff1a;https://pan.quark.cn/s/58d9072e51c4 二、安装mysql8 双击msi文件 选择custom 根据所需选择组件 修改安装路径 选中execute&#xff0c;安装&#xff0c;弹出提示安装VS的提示框之后…

【CSP试题回顾】201409-3-字符串匹配

CSP-201409-3-字符串匹配 关键点&#xff1a;<string>库函数的使用 length() 或 size(): 返回字符串的长度。 empty(): 检查字符串是否为空。 append() 或 : 向字符串的末尾添加字符或另一个字符串。 insert()在字符串的指定位置插入另一个字符串或字符。 std::str…

LVS+Keepalived 高可用负载均衡集群

一. 高可用集群的相关知识 1.1 高可用&#xff08;HA&#xff09;集群和普通集群的比较 ① 普通集群 普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度…

计网《一》|互联网结构发展史|标准化工作|互联网组成|性能指标|计算机网络体系结构

计网《一》| 概述 计算机网络在信息时代的作用什么是互联网呢&#xff1f;互联网有什么用呢&#xff1f;为什么互联网能为用户提供许多服务 互联网基础结构发展的三个阶段第一个阶段&#xff1a;第二阶段&#xff1a;第三个阶段&#xff1a; 互联网标准化的工作互联网的组成边缘…

如何排查合并问题——《OceanBase诊断系列》之七

1. 前言 OceanBase数据库的存储引擎以 LSM-Tree 架构为基础&#xff0c;区分静态基线数据&#xff08;存储在只读SSTable&#xff09;和动态增量数据&#xff08;存储在可读写MemTable&#xff09;。其中 SSTable 是只读的&#xff0c;一旦生成就不再被修改&#xff0c;存储于…

链表习题-力扣oj (附加思路版)

LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 思路&#xff1a;双指针&#xff0c;快指针先走cnt…

Jenkins集成SonarQube

文章目录 SonarQube端开启权限验证生成Jenkins登录的token Jenkins端安装SonarQube Scanner插件配置SonarQube凭证配置Jenkins的Sonar Qube信息配置SonarQube Scanner 配置项目的SonarScannerJAVA项目C#项目 效果 SonarQube端 开启权限验证 生成Jenkins登录的token 生成后记得…

“中国与亚洲国家”成比特币暴涨幕后推手!微信“比特币”搜索量猛增12倍!FOMO情绪四处流窜?

自2023年10月初以来&#xff0c;比特币的价格经历了一轮惊人的上涨&#xff0c;累积涨幅达到了160%。虽然这与美国证监会批准比特币现货交易所交易基金&#xff08;ETF&#xff09;分不开&#xff0c;但最近的一波上涨更多得益于亚洲国家的投资者积极参与。 本周二比特币升至69…

springboot233大学生就业需求分析系统

大学生就业需求分析系统设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…

arm系统构建的基础知识

目录 一、环境变量 二、归档和压缩 (一) 常用命令 (二) 常用参数 三、磁盘分区和挂载 四、网络管理 一、环境变量 显示环境变量 —— echo设置临时环境变量 —— exportecho $PATH —— 显示当前PATH环境变量 在当前目录下&#xff0c;编写一个hello.c 编译并运行。 图…