【Leetcode】704 二分查找 / 27 移除元素

题目描述:不重复升序数组的二分查找。
二分查找可视化:https://www.cs.usfca.edu/~galles/visualization/Search.html

704 二分查找

1 递归分治

class Solution {
    public int search(int[] nums, int target) {
        return search(nums, target, 0, nums.length - 1);
    }

    public int search(int[] nums, int target, int l, int r) {
        if (l > r) {
            return -1;
        }

        int q = (r - l) / 2 + l;
        if (nums[q] == target) {
            return q;
        }
        else if (nums[q] < target) {
            return search(nums, target, q + 1, r);
        }
        else {
            return search(nums, target, l, q - 1);
        }
    }
}
  1. int q = l + (r - l) / 2; 为了防止溢出;
  2. search函数的含义:在nums[l], nums[l+1]...nums[r]中查找元素target,即左闭右闭区间
  3. m i d = ⌊ l + r 2 ⌋ mid=\lfloor\frac{l+r}{2}\rfloor mid=2l+r将数组划分为 [ l , m i d − 1 ] [l,mid - 1] [l,mid1] [ m i d + 1 , r ] [mid+1,r] [mid+1,r]两个部分,判断应该在哪一半继续搜索

2 移动左右指针

class Solution {
    public int search(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while(l <= r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            else if (target < nums[mid]) { 
                // 搜索左半部分
                r = mid - 1;
            }
            else {
                l = mid + 1;
            }
        }
        return -1;
    }
}
  1. 注意边界条件,当 l ≤ r l\le r lr时可以继续循环,即 [ l , l ] [l,l] [ll]的区间是有意义的
  2. 判断 t a r g e t target target n u m s [ m i d ] nums[mid] nums[mid]的关系时不要写错,仔细点捏

27 移除元素

一开始想的是记录每个元素应该move的距离x,后来发现可以直接用两个指针i,j,一个指向新数组下一个元素应该插入的位置,一个遍历旧数组,两个指针均递增,循环条件为j < nums.length,即旧指针遍历完整个数组。

class Solution {
    public int removeElement(int[] nums, int val) {
        // 使用快慢指针
        // 1、新数组的下一个位置
        int i = 0;
        // 2、遍历旧数组时的位置
        int j = 0;
        while (j < nums.length) {
            if (nums[j] != val) {
                nums[i] = nums[j];
                i++;
            }
            j++;
        }
        return i;
    }
}

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