代码随想录算法训练营第一天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;
    }
}
 
 
posted @ 2024-07-22 15:06  twinklezhao  阅读(1)  评论(0编辑  收藏  举报