一、704. 二分查找
题目链接:https://leetcode.cn/problems/binary-search/description/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
1.1 初见思路
有序数组找目标值–》二分法
二分法需注意点:范围区间,左闭右开 或 左闭右闭
1.2 具体实现
class Solution {public int search(int[] nums, int target) {//左闭右开int left=0;int right = nums.length-1;int mid=0;while(left<right){mid = left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else if(nums[mid]>target){right=mid;}else{return mid;}}return -1;}
}
1.3 重难点
- while循环的循环条件是< 还是 <=?
- 给left 和 right 赋值时,是否应该+1,原值,还是-1?
上述两点重点就在于对 取值区间的选择,左闭右开/左闭右闭
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
对区间的选择的理解
[图片]
二、 27. 移除元素
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
2.1 初见思路
采用双指针的方式,把所有需要删除的val都移到数组的最后。
左指针指向等于val的值,右指针指向不等于val的值,swap(),同时计数+1,最后返回计数。
2.2 具体实现
class Solution {public int removeElement(int[] nums, int val) {if(nums.length==0){return 0;}int left=0;int right = nums.length-1;while(left<=right){if(nums[left]==val){nums[left]=nums[right];right--;}else{left++;}}return left;}}
2.3 重难点
解题过程中一直无法通过,最终发现问题就出在while的循环条件上!
循环条件是<=