程式碼隨想錄演算法訓練營第一天leetcode704二分查詢27移除元素

twinklezhao發表於2024-07-22

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
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;
}
}

相關文章