参考文献链接:代码随想录
本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。
704. 二分查找
解题思路
这道题明确规定了数组是有序并且不重复的,要在这样的数组中寻找一个给定值的位置不由得让我想起来以前的数学知识二分查找。所以很快确定了思路就是去比较数组中间位置的值和目标值的大小,根据谁大谁小去调整二次判断的数组,一次次筛选直到找到目标值或没有目标值为止。
代码示例
class Solution {
public int search(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
while(end - start >= 0){
//获取数组中间位置
int mid = (end - start) / 2 + start;
int num = nums[mid];
if(num > target){
//如果中间值比目标值大,则把数组设定为中间下标左边数组
end = mid - 1;
}else if(num < target){
//如果中间值比目标值大,则把数组设定为中间下标右边数组
start = mid + 1;
}else{
//如果相等则找到了目标下标
return mid;
}
}
//没找到则返回-1
return -1;
}
}
遇到的问题
这道题容易出错的地方就是while循环的条件该不该带等于号,这种情况我一般会拿一组用例在自己脑子里过一遍。
假设{1,2,3}这组用例我们要找的target值是3,第一次循环的左下标是0,右下标是2,找到中间值是2比target值3小,所以我们将左下标调整为中间下标+1即为2,此时我们数组左右下标均为2,但目标值正好是下标2对应的值,所以应有left=right这个循环条件。
27.移除元素
解题思路
这道题目的意思是要把一个数组中的目标值都删除掉,但数组不能删除元素,所以我们只能覆盖。
暴力解法
最初做这道题的时候想法很简单,直接暴力循环。
首先循环数组去查找目标值位置,找到之后再来一个循环将其后面的元素进行覆盖即可。
暴力解法的时间复杂度是O(n^2),简单易想。
双指针法
第一次接触双指针就是在这个题目,它的用处就是将两个循环做到的事情用一个循环解决。
对于这道题目来说,我们将两个指针都放到数组初始位置,如果当前位置的值不是目标值那两个指针就一起前进,当遇到目标值时,慢指针不前进,快指针继续前进直到找到不是目标值的元素,此时将快慢指针位置的值交换,并且慢指针也可以继续前进了。这样下去快指针会把我们需要的元素都与慢指针交换,这样我们就把不需要的元素全都放到了后面。
用一句话总结:慢指针负责在不想要的元素位置上占位,而快指针负责前进去寻找想要的元素。
class Solution {
public int removeElement(int[] nums, int val) {、
//初始化快慢指针
int slow = 0;
for(int fast = 0;fast<nums.length;fast++){
//当目标值与快指针值不同时,快慢指针一起前进并且交换位置
if(val!=nums[fast]){
nums[slow++] = nums[fast];
}
//当相同时,慢指针负责在不想要的元素位置上占位,快指针去寻找想要的元素与之交换。
}
return slow;
}
}