[leetCode]二分查找例题与反证法证明(35. 搜索插入位置)

阅读: 评论:0

[leetCode]二分查找例题与反证法证明(35. 搜索插入位置)

[leetCode]二分查找例题与反证法证明(35. 搜索插入位置)

目录

一、题目简介

代码:


一、题目简介

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

请必须使用时间复杂度为 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

来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码:

其中最难理解的是返回值为什么是left或者right+1

只需要推出最终的right的停留位置一定是比target小的最大的数的位置即可

简略的反证法:假设right停止的位置的数等于target,则会在前面的代码中返回。

假设right停止的位置的数大于target,则此时left<=right,则mid<=right则循环不会停止,故于假设矛盾。

假设right停止的位置的数小于比target小的最大的数,则一定有一次循环中right的位置大于等于比target小的最大的数的位置,此时有nums[mid]>target才能移动right。但此时mid一定小于比target小的最大的数的位置,因此target>=nums[mid],故与假设矛盾。

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:#二分查找n=len(nums)left=0right=n-1#当left<=right,始终符合target属于 [left,right] while(left<=right):mid=left+int((right-left)>>1)if(nums[mid]<target):left=mid+1elif(nums[mid]>target):right=mid-1else:return mid#如果没找到对应数,最后right会落在大小比target小的最大的数的位置#而left会落在right+1的位置上#因为最后一次判断时left=right#而此时nums[left]<target#或return left+1return left

本文发布于:2024-01-28 05:38:57,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063915435186.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:反证法   例题   位置   leetCode
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23