【代码随想录算法训练营-第一天】【数组】704. 二分查找、27. 移除元素

LeetCode-704.二分查找

【错误】第一遍提交的代码

  • 主要错误点:
    • 没弄清楚区间的定义导致:r 在定义处的赋值和 if 判断之后 r 的复制没有想清楚;
    • 没有搞清楚判断循环结束的条件;
    • 没有搞明白区间的定义,r 和 l 如何赋值,如何判断;
class Solution {
    public int search(int[] nums, int target) {
        int l = 0;
        // 这里的赋值和while的判断条件矛盾,会陷入死循环,导致超时
        int r = nums.length - 1; 
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        while (l <= r) {
            int mid = (r + l) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] < target) {
                l = mid+1;
            }
            if (nums[mid] > target) {
                r = mid+1;
            }
        }
        return -1;
    }
}

【正确】第二遍提交代码

  • 搞清楚区间的定义,并判断左闭右开的区间范围,如何判断r 和 l 的赋值,以及while结束的条件;
class Solution {
    public int search(int[] nums, int target) {
int l = 0;
        int r = nums.length;
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        while (l < r) {
            int mid = (r + l) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] < target) {
                l = mid+1;
            }
            if (nums[mid] > target) {
                r = mid;
            }
        }
        return -1;
    }
}

LeetCode-27.移除元素

【正确】双指针一次AC!

  • 因为不用考虑末尾的元素,所以只要保证fast指针每次有和val相等的元素就跳过,然后赋值给slow指针指向的元素即可。
  • 代码随想录给出的是相向双指针,我用的是同向,测试了一下结果差不多。
class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0, fast = 0;
        while (fast < nums.length) {
            if (nums[fast] == val) {
                fast++;
                continue;
            }
            nums[slow] = nums[fast];
            fast++;
            slow++;
        }
        return slow;
    }
}

你可能感兴趣的:(算法)