LeetCode: 704. 二分查找
题目链接:力扣
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
题目详细描述
做题步骤
- 图示
- 流程图
- 手撕代码
- 观看视频讲解---希望下次可以直接放笔记链接
- 调试运行
int search(int* nums, int numsSize, int target){ int low=0; int high=numsSize-1; while(low<=high){ int mid=(low+high)/2; if(target<nums[mid]){ high=mid-1; } else if(target>nums[mid]){ low=mid+1; } else if(target==nums[mid]) return mid; } return -1; }
运行时间,内存消耗。
- 观看其他相似题解
- 分析知识点
- 数组:具有随机存储的特性。
- 二分查找:借用三个 指针实现对数组元素的查找。
- 整理记忆内容
- 记忆:数组随机存储。
- 习惯:三指针
- 思考:如何想到三指针
- 其他相关题目观看
反思总结
- 分析复杂度
-
时间复杂度:O(logn),其中 n 是数组的长度。
-
空间复杂度:O(1)。
-
由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是O(logn),其中 n 是数组的长度。
-
- 细节改善(规范化)
- 关于使用left还是right的问题
- 关于先列举哪种条件的问题
- 提高可复用性(将常量用可定义的变量代替)
- 举一反三
- 设计二分法模板
- 题目信息:
- 题目的前提要求:是数组为有序数组,数组中无重复元素
- 要求找出某个确定元素,并返回下标。
- 若题目要求时间复杂度带 logN
- 模板:
-
int search(int* nums, int numsSize, int target){ int left = 0, right = numsSize - 1; while (left <= right) { int middle = left + ((right - left) / 2); if (nums[middle] > target) { right = middle - 1; } else if (nums[middle] < target) { left = middle + 1; } else { return middle; } } return -1; }
-
- 题目信息:
LeetCode: 27.二分查找
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:力扣
题目说明:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度和变化后的数组。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
文章讲解:代码随想录
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
做题步骤
知识点总结:
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。