代码随想录算法训练营第一天leetcode704二分查找27移除元素
leetcode704,这是leetcode提交四次后通过的结果:
class Solution {
public int search(int[] nums, int target) {
if(nums.length==1&&nums[0]==target)
return 0;
if(nums.length==2)
if(nums[0]==target)
return 0;
else if(nums[1]==target)
return 1;
int left= 0;
int right = nums.length-1;
int middle = (int)Math.floor((right-left+1)/2);
while(left<right&&middle>left&&middle<right){
if(nums[left]==target)return left;
if(nums[right]==target)return right;
if(nums[middle]>target){
right = middle;
middle = left + (int)Math.floor((right-left+1)/2);
}else if(nums[middle]<target){
left = middle;
middle = left + (int)Math.floor((right-left+1)/2);
}else{
return middle;
}
}
return -1;
}
}
没错,主打一个复杂又啰嗦。第一次没通过是没判断数组长度为1的情况;第二次没通过没判断数组长度为2的情况;第三次没通过是没判断左右边界是否就是要找的target值,所以把这三种情况都写进去就通过了,leetcode要是有新的测试用例,记得通知我。还有个易出错的地方,计算middle的时候,要加上left这个基地址。
上面是写的虽然过了力扣的测试用例,但是看了视频,有不少改进的地方:
1:middle=(right+left)>>>1,不用显示调用floor,默认floor操作。
2,<>target后,right、left的边界不是直接用middle替换,要±1,多想一下,middle并不等于,所以范围不是从middle开始(while种的left、right不是由此)。
leetcode27移除元素
除了暴力解法,参考随想录的双指针方法。
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0,fast=0;
for(fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
}