代码随想录算法训练营第1天 | 704.二分查找、27.去除元素

代码随想录算法训练营第1天 | 704.二分查找、27.移除元素

704.二分查找

题目:704.二分查找
文档讲解:代码随想录-704.二分查找
视频讲解:哔哩哔哩-704.二分查找
状态/时间:写出来了/十分钟

思路:
左开右闭:
定义左右指针,并且取一个中间值mid,这里要我喜欢用左闭右闭原则,因此 while循环的退出条件为:left <= right,mid为 left + (right- left)/2 这样写是为了防止越界
当nums[mid] == target时,我们就直接返回mid,就是target的位置了
当nums[mid] < target时,说明target是在左边这一部分,所以[left, mid - 1]。
当nums[mid] > target 时,说明target是在右边这一部分,所以[mid + 1, right]

代码:

class Solution {
    public int search(int[] nums, int target) {
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        // 左边指针
        int left = 0;
        // 右边指针
        int right = nums.length - 1;
        // 中间值
        int mid;
        // 循环,退出条件为:<= 因为左闭右闭原则
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            // 等于target的情况
            if (nums[mid] == target) {
                return mid;
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return -1;
    }
}

27.移除元素

题目:27.移除元素
文档讲解:代码随想录-27.移除元素
视频讲解:哔哩哔哩-27.移除元素
状态/时间:没写出来/四十分钟

法一:暴力解法

思路:
可以用for循环判断,也可以快慢指针解决,先用快指针找到新数组所需要的。
代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int size = nums.length;
        for(int i = 0; i < size; i++) {
            if(nums[i] == val){
                for(int j = i + 1; j < size; j++){
                    nums[j - 1] = nums[j];
                }
                i--;
                size--;
            }
        }
        return size;
    }
}

法二: 快慢指针

思路:

用快指针来当循环,当快指针的值不等于删除的值(val)的时候,就把块指针的值,赋值到慢指针;

当快指针遇到val时,慢指针就停下来,然后快指针继续走,遇到不是val的时候,把快指针的值,赋值到慢指针,这样val就成功覆盖删除了。

最后返回慢指针,就是数组的长度以及删除val后的数组了

代码:

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];
            }
        }
        return slowIndex;
    }
}

注意:

直接在for循环定义快指针就好, 不要定义i,然后在这个循环里面再来写fast slow,这样代码就变得更复杂。

你可能感兴趣的:(代码随想录训练营,算法)