声明:
今天是第10道题。给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置,可以假设数组中无重复元素。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5 输出: 2
示例 2:
输入: [1,3,5,6], 2 输出: 1
示例 3:
输入: [1,3,5,6], 7 输出: 4
示例 4:
输入: [1,3,5,6], 0 输出: 0
解法1。将问题拆分成简单和复杂两种,简单的就是先写if语句判断target需要插入在首尾的情况,再考虑遍历的情况
class Solution:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# V 1.0,能提交
# 先比较首尾元素,这是2种比较简单的情况
if nums[0]>target:
return 0
if nums[-1]<target:
return len(nums)
# 再考虑需要遍历数组的情况
if target in nums:
return nums.index(target)
else:
for num in nums:
if num > target:
return nums.index(num)
return 0
解法2。常规的做法,用二分法遍历,这里是left<right的情况,还有种left<=right的情况,代码更简洁,在结尾解法2的链接中这两种写法的示例都有。
class Solution:
def searchInsert(self, nums, target):
# V 2.0,能提交
if not nums:
return 0
left = 0
right = len(nums) - 1
while left < right:
mid = int((left+right)/2) # 注意这里一定要强制转换成int型,不然提交时会报TypeError
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target: # 注意这里elif后一定要接判断条件才符合Python语法
left = mid + 1
else:
return mid
if(nums[left] < target): # 跳出while循环后left=right或者left=right+1,此时仍需继续判断target需插入的index值
return left + 1
else:
return left
结尾
解法1:自己的思路杂糅别人的思路,在此便不贴出了。
解法2:https://blog.csdn.net/qqxx6661/article/details/77959515
扫描二维码关注公众号,回复:
3331075 查看本文章