1. LeetCode 704.二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 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
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
解法:
-
左闭右闭区间
def binary_search(nums, target): l, r = 0, len(nums) - 1 while l <= r: mid = (l + r) // 2 print(mid) if nums[mid] < target: l = mid + 1 elif nums[mid] > target: r = mid - 1 else: return mid return -1
-
左闭右开区间
def binary_search(nums, target): if nums is None or len(nums) == 0: return -1 l, r = 0, len(nums) while l < r: mid = (l + r) // 2 if nums[mid] > target: r = mid elif nums[mid] < target: l = mid + 1 else: return mid return -1
2. 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
解法:
-
暴力解法:
def search_insert(nums, target): if target in nums: for i, num in enumerate(nums): if num == target: return i else: for i, num in enumerate(nums): if num > target: return i elif nums[-1] < target: return len(nums)
-
二分法:
def search_insert(nums, target): l, r = 0, len(nums) - 1 while l <= r: mid = (l + r) // 2 pre = nums[mid] if pre > target: r = mid - 1 elif pre < target: l = mid + 1 else: return mid return l