704二分查找,278第一个错误版本,35搜索插入位置

二分查找

https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7

顺序查找:

func search(nums []int, target int) int {for i:=0;i<len(nums);i++{if nums[i]==target {return i}}return -1
}

二分查找:

func search(nums []int, target int) int {left:=0right:=len(nums)-1mid:=(left+right)/2for left<=right {if nums[mid]==target {return mid}if nums[mid]<target {left=mid+1}else{right=mid-1}mid=(left+right)/2}return -1
}

第一个错误版本


从尽量减少API的次数,不难发现使用二分查找。考虑提供的isBadVersion(version) 函数,若返回真,则证明,参数之后的版本都是错误的,结果仍在参数或参数之前的版本(注:参数很可能就是第一个出错的版本,因此不能放弃),若返回假,则证明参数之前的版本都是正确的,结果在参数之后的版本

return返回left:当左右边界收缩到一点时,这一点为第一个错误的版本,若返回version,考虑存在示例2,这一特殊情况,因此选择返回left

func firstBadVersion(n int) int {var left,right,version intleft=1;right=nfor left<right{//此处的写法是防止计算溢出version=left+(right-left)/2if isBadVersion(version){right=version}else{left=version + 1}}  return left
}

官方版本go解法,直接调用函数sort.Search
func Search(n int, f func(int) bool) int
Search函数采用二分法搜索找到[0, n)区间内最小的满足f(i)==true的值i。其中的第二个参数经常为闭包

func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) })
}

搜索插入位置


经典二分查找:考虑需要找到目标值,并返回索引,且若找不到,要按顺序插入,且根据示例1,知若相同,要在相同值之前,即修改后的数组中原相同值的位置。因此只需找到第一个大于或等于target的值的位置

func searchInsert(nums []int, target int) int {left, right := 0, len(nums) - 1for left <= right {//位运算,和除以2相同结果,加快运算速度mid := (right - left) >> 1 + leftif target <= nums[mid] {right = mid - 1} else {left = mid + 1}}return left
}

力扣算法学习计划打卡:第一天相关推荐

  1. 力扣算法学习计划打卡:第六天

    3无重复字符的最长子串,567 字符串的排列 无重复字符的最长子串 滑动窗口/双指针 func max(a,b int)int{if a<b{return b}return a }func le ...

  2. 力扣算法学习计划打卡:第八天

    617.合并二叉树,116.填充每个节点的下一个右侧节点指针 合并二叉树 深度优先搜索 /*** Definition for a binary tree node.* type TreeNode s ...

  3. 力扣算法学习计划打卡:第五天

    876链表的中间结点,19删除链表的倒数第N个节点 链表的中间结点 用两个指针 slow 与 fast 一起遍历链表.slow 一次走一步,fast 一次走两步.那么当 fast 到达链表的末尾时,s ...

  4. 力扣算法学习计划打卡:第七天

    733 图像渲染,695 岛屿的最大面积 图像渲染 广度优先搜索 var(dx = []int{1,0,-1,0}dy = []int{0,1,0,-1} ) func floodFill(image ...

  5. 力扣算法学习计划打卡:第二天

    977有序数组的平方,排序算法复习,189轮转数组 https://leetcode-cn.com/study-plan/algorithms/?progress=lv45wk7 有序数组的平方 排序 ...

  6. 力扣算法学习计划打卡:第三天

    283 移动零,167. 两数之和 II - 输入有序数组 移动零 不能复制数组,考虑计数0的个数,当前数组元素前存在counts个0元素,该数组元素向前移动counts个值,最后将counts个0放 ...

  7. 力扣算法学习计划打卡:第四天

    344反转字符串,557. 反转字符串中的单词 III 反转字符串 双指针,分别指向字符数组的头和尾,交换后,两个指针同时向中间移动 func reverseString(s []byte) {for ...

  8. 力扣算法学习(十四)

    最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例 1: 输入:grid = ...

  9. 力扣算法学习(十二)

    斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) ...

最新文章

  1. 全球最大最干净的人脸公开训练集!格灵深瞳发布Glint360K
  2. Unity的对象复用
  3. 【转】mac os、linux及unix之间的关系
  4. 【Python】推荐6个好用到爆的Pycharm插件
  5. filezilla 设置服务器_java项目部署到linux服务器,微信小程序后台springboot项目部署到腾讯云服务器(图文详解)...
  6. 用生产者和消费者模式实现奇数偶数不同线程交替输出
  7. poj 1426 BFS
  8. java常量池方法区_Java方法区和运行时常量池溢出问题分析
  9. ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address   already
  10. 在CentOs6.5安装jdk
  11. Paxos在大型系统中常见的应用场景
  12. tomcat多实例的端口设置
  13. svn环境搭建 linux
  14. log(一)——MDC入门
  15. 逆向破解之160个CrackMe —— 023-024
  16. 面包板入门电子制作 学习笔记8
  17. ubuntu如何安装及卸载mysql服务详细教程-图文版
  18. linux内核开启otg,OTG驱动分析(一)
  19. 机器学习三剑客之Matplotlab
  20. SRAMRAMROM介绍

热门文章

  1. Elasticsearch的基本使用
  2. compressSlice函数代码跟踪
  3. 怎么修改设置路由器默认密码
  4. 如何写个优秀的Github项目Readme文档?经典模版拿去不谢~
  5. jupyter notebook设置标题折叠
  6. 项目实战No2 登陆注册
  7. Android 心形图片心形ImageView、带边框的的心形图片和圆形图片
  8. python 希尔伯特变换_Python中HHT(希尔伯特-黄变换)以及其在EEG数据处理中的应用...
  9. android saf 打开指定目录,并操作相关文件
  10. Python细枝末节个人知识记录