LeetCode刷题笔记:二分查找与移除元素算法解析

需积分: 0 0 下载量 75 浏览量 更新于2024-08-03 收藏 2KB MD 举报
本文是关于LeetCode算法题目的刷题笔记,涵盖了704.二分查找和27.移除元素两道题目,旨在帮助学习算法和数据结构的程序员或学生提升编程能力。 在704.二分查找题目中,给定一个有序整型数组`nums`和目标值`target`,任务是找到`target`在数组中的下标,如果不存在则返回-1。此题的核心是利用二分查找算法。二分查找的基本思想是每次比较中间元素与目标值,根据比较结果缩小查找范围。具体步骤如下: 1. 初始化左边界`left`为0,右边界`right`为数组长度减1。 2. 当`left <= right`时,执行以下操作: - 计算中间索引`middle = (left + right) / 2`。 - 比较`nums[middle]`与`target`: - 如果`nums[middle] > target`,说明目标值在左半部分,更新`right = middle - 1`。 - 如果`nums[middle] < target`,说明目标值在右半部分,更新`left = middle + 1`。 - 如果`nums[middle] == target`,找到了目标值,返回`middle`。 3. 如果循环结束仍未找到目标值,返回-1。 提供的Java参考代码展示了如何实现这个算法,通过不断调整左右边界,直到找到目标值或确定其不存在。 在27.移除元素的题目中,要求在原地移除数组`nums`中所有值等于`val`的元素,并返回新的长度。这里的关键是利用双指针法。具体做法如下: 1. 初始化两个指针,`slow`和`fast`,都从数组的起始位置开始。 2. 当`fast`指针未到达数组末尾时,执行以下操作: - 若`nums[fast] != val`,则将`nums[slow]`更新为`nums[fast]`,并将`slow`指针向右移动一位,保持数组的有效元素顺序。 - 无论`nums[fast]`是否等于`val`,都将`fast`指针向右移动一位,继续检查下一个元素。 3. 执行完上述步骤后,`slow`指针所指向的位置就是新数组的末尾,返回`slow`作为新的数组长度。 通过这种方式,我们可以在不使用额外空间的情况下原地修改数组,跳过了所有值为`val`的元素,使得有效元素紧凑排列在数组前面。 这两道题目的解决策略都是针对特定问题设计的高效算法:二分查找利用了有序数组的特性,而双指针法则巧妙地解决了原地修改数组的问题。在学习和实践中,读者应重点理解和掌握这两种算法的思想,以便在未来遇到类似问题时能够灵活应用。