704 二分查找
题目链接
https://leetcode.cn/problems/binary-search/
看完题后的思路
二刷,温故而知新
思路
二分查找算法中的一个难点是收缩搜索区间过程中对left和right的赋值,到底right是等于 mid,还是mid-1,left到底是等于mid,还是mid+1.将区间的端点的开闭定义好,保持循环中不变,在循环中我们遵循事先的定义,对left,right的定义就不会乱了。
另一个难点是while的终止问题,同样根据不变量原则,括号里写上满足条件的情况.当[]时,left>right时代表没有元素,所以left<=right为循环条件.[)时,right==left时代表没有元素,所以终止条件为left<right
代码
public int search(int[] nums, int target) {
int left=0,right=nums.length; // [)
while (left<right){
int mid=left+((right-left)>>2);
if (nums[mid]==target){
return mid;
}else if (nums[mid]<target){
left=mid+1;
}else {
right=mid;
}
}
return -1;
}
时间复杂度
0(logn)
实现过程中遇到的困难
无
27 移除元素
https://leetcode.cn/problems/remove-element/
看完题后的思路
二刷,温故而知新
思路
本题如果使用暴力算法,时间复杂度为0(n^2).可以使用双指针法,双指针法的关键是写代码前对指针所代表的意义搞清楚,这样在写代码的时候就不会乱了. 例如本题, 1代表有效数组末尾的下一个元素 curr代表当前要检查的元素.
代码
public int removeElement(int[] nums, int val) {
int l=0,curr=0; // 1 有效数组末尾的下一个元素 curr:当前要检查的元素
while (curr<nums.length){
if (nums[curr]==val){
curr++;
}else {
nums[l++]=nums[curr++];
}
}
return l;
}
时间复杂度
0(logn)
实现过程中遇到的困难
无