分类: 未分类

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

    思路:
    左开右闭:
    定义左右指针,并且取一个中间值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,这样代码就变得更复杂。
    ————————————————

  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!