二分查找+移除元素
记录自己code的过程
二分查找
耗时:12min
错误提交:4次但是最后正确提交
初始思路:
一开始拿到题目有一个大概的思路,就是我需要有三个指针,一个指针指向数组的头部,一个指针指向数组的尾部,一个指针由头和尾计算而来,如果我的nums[mid]==target就返回当前的数值,如果nums[mid]>target,就令end=mid-1,nums[mid]<target,就令start=mid+1.
错误原因:
对于循环执行的边界很模糊,搞不清是start<end结束循环还是start<=end结束循环
题解复盘
while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则
1)左闭右闭
start=0;end=length-1;
此是while(start<=end),右边界更新时end=mid-1;
2)左闭右开
start=0;end=length;
此时while(start<end),右边界更新时end=mid;
//左闭右闭情况
class Solution {
public int search(int[] nums, int target) {
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
}
return -1;
}
}
1)就我自己的code而言,我没有做第一个初始判断
2)我的mid定义 int mid=(start + end)/2;
为了避免溢出应该:start+(end-start )/2;
3)二分使用有前提条件:数组为有序数组,同时题目还强调数组中无重复元素
移除元素
耗时:22min
错误提交:4次但是最后正确提交
初始思路:
针对于暴力解法的大概思路有,找到一个值之后,让他后面的值覆盖掉前面的值
错误原因:
对于一些变量的更改理解的不够准确,比如找到这个值之后,i--后在i++,这样可以判断当前位置的值,同时移除一个元素之后,记录数组长度的变量length要记得-1.
题解复盘
1)暴力解法:没什么好说,把思路和变量值的更新注意好了就可以
2)双指针法:直接看吧(呜呜)简单描述一下思路就是快指针表示新数组的元素,慢指针表示新数组元素存入的位置,当快指针所指元素的数值不等于要移除的元素值时就将快指针的值存入慢指针所指的位置,快指针用for循环遍历数组,慢指针只有添加了元素才会指向下一个元素。
对于时间复杂度和空间复杂度的理解还不是很清楚,找时间补一下...