@[TOC]
LeetCode 704.二分查找
解题思路:使用了**[left,right]**的写法,即left == right是有意义的,此时循环条件是while(left <= right)
遇到的问题:写mid = left + (right - left) >> 1时会超时,这是因为 >> 没有 + 的优先级高,更改为mid = left + ((right - left) >> 1)
其它收获:有if、if、else时,执行了第一个if之后会进入else,起不到分支的作用,此时出现了逻辑问题(图1);
while和for的使用:while擅长于条件控制的循环,for擅长于起始位置和终止位置固定好的循环
图1
附一张运算符优先级表:
图2
代码实现:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
if(target < nums[0]||target > nums[nums.length - 1]){
return -1;
}
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] == target){
return mid;
}
}
return -1;
}
}
LeetCode 27.移除元素
解题思路:使用双指针法,通过一个快指针和一个慢指针在一个for下完成两个for的工作
快指针:遍历整个数组,找到所有不匹配的值(赋值给慢指针),遇到相等的就跳过继续看后面的
慢指针:慢指针指的全是不匹配的值
遇到的问题:会忘记快慢指针的作用,需要多次在脑海中复现
代码实现:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
int fastIndex = 0;
int len = nums.length;
for(slowIndex = 0;fastIndex < len;fastIndex++){
if(nums[fastIndex] != val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
}