leetcode 704 二分查找 27 移除元素 35 Search Insert Position

450 阅读1分钟

数组这块需要理解连续内存地址与变量的指引关系,下标的操作和不同语言里的关于数组的built-in函数。

原理参考Carl哥的数组讲解:programmercarl.com/%E6%95%B0%E…

- leetcode 704 二分查找 easy

题目链接: leetcode.com/problems/bi…

思路: 目标值比较下标在中间的位置的值,操作左右下标改变搜索范围锁定目标值位置。

代码:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = (right - left) / 2 + left;
            if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
}

提交报错 (1):

第1次: 数组只有1个元素时需要考虑清楚边界条件,左右下标比较需要等于。

- leetcode 27 移除元素 easy

题目链接: leetcode.com/problems/re…

思路: 双指针类型的经典快慢指针,策略是快指针先走,遍历寻找目标删除值。没遇到则快指针位置值给慢指针位置值,遇到则快指针单走慢指针不动。

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] == val) {
                continue;
            } else {
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}

- leetcode 35 Search Insert Position easy

题目链接: leetcode.com/problems/se…

思路: 二分查找的变型,有区别的地方在没有找到的情况需要输出该插入位置的下标,这种情况属于最后一次比较时,是目标值比当前mid节点大的情况。left在没找到的情况刚好走到mid的下一个位置进不去while循环。

代码:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return left;
    }
}