LeetCode 704 二分查找

题目链接:https://leetcode.cn/problems/binary-search/

自己遇到的问题:

1、在LeetCode执行代码时报错

error: cannot find symbol [in __Driver__.java]
      double[] ret = new Solution().dicesProbability(param_1);
                                   ^
  symbol:   method dicesProbability(int)
  location: class Solution

原因是我更改了原来LeetCode 上函数的名字所以报错。

代码实现

这里是左闭右闭的写法 [left,right] 的代码实现

public static  int Search(int[] nums,int target){
        if(target < nums[0]|| target > nums[nums.length-1])//先判断是否符合要求,因为数组是有序的
            return -1;
        int left = 0,right = nums.length - 1;
        while(left <= right){//左闭右闭的含义是一个数值能否同时等于left和right
            int mid =  (left+ right)/2;
            if(nums[mid] == target){
                return mid;
            }else if(target > nums[mid]){
                left = mid + 1;//如果target在右边,则进右区间
            }else if(target < nums[mid]){
                right = mid - 1;//在左边更改右边界,进 左区间
            }
        }
        return -1;
    }

这里是左闭右开的写法[left,right) 代码实现

public int search(int[] nums, int target) {
        int left = 0, right = nums.length;//这里不需要减一,因为取不到,右开。
        while (left < right) {//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;//右边界取不到
        }
        return -1;
    }

总结

二分查找算法的重难点我认为就是定义区间的端点,一般有两种情况一种就是左闭右闭一种则是左闭右开。

1、在左闭右闭的情况下,我们每次都要扫描区间的两个端点,所以在这种情况下如果中间元素大于Target或者中间元素小于Target,那么我们对应的需要更新mid左边一个或者mid右边一个的位置。
2、在左闭右闭的情况下,我们每次都要扫描区间的左端点left,但是不扫描right,因此我们使用中间元素去比较目标值Target的时候,如果中间值大于Target,此时我们应当更新左区间的右端点,但是又因为我们不扫描右端点所以此时更新right的时候,直接等于right = mid即可,如果中间值小于Target,则更新left = mid+1。

LeetCode 27 删除元素

题目链接:https://leetcode.cn/problems/remove-element/

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置

代码实现

class Solution {
    public int removeElement(int[] nums, int val) {
        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}

总结

这里的快指针在不停的进行for循环,然后向前走,看到不等于val的才将值赋值给慢指针


版权声明:本文为haha9417原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/haha9417/article/details/128468970