代码随想录训练营第一天 | 704.二分查找、27.移除元素

date
Jul 17, 2024
slug
Leetcode-arrary-704
status
Published
tags
Arrary
数组
Leetcode
summary
数组理论基础 704.二分查找 27.移除元素训练
type
Post

704.二分查找

Question

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例 :

Example 1:
Example 2:

Idea

💡
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

解题思路

📖
首先这道题的前提是数组为有序数组,同时数组中无重复元素。一旦有重复元素我们再使用二分查找法返回的元素下标可能不是唯一的。(这是是否适用二分法的判断)
确定好使用二分法后,为了防止写乱,需要想清楚区间的定义,区间的定义就是不变量。
保持不变量的前提就是在while寻找每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
二分法区间的两种定义:左闭右闭[left,right],左闭右开[left,right)。
 
左闭右闭要点:
  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
notion image
左闭右开要点:
  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
notion image
 

Solution 1 左闭右闭[left,right]

Solution 2 左闭右开区间[left,right)

 

总结

二分法是非常重要的基础算法,主要是要明白在循环中坚持根据查找区间的定义来做边界处理。
区间的定义就是不变量,坚持循环不变量规则。
 

相关题目推荐


© Jianqiao Fang 2024