算法| Day01 数组

64 阅读1分钟

1. LeetCode704 二分查找

image.png 题解: 二分查找重点是在left区间和right区间上,如左闭右闭还是左闭右开,如何区分? 主要就是可以采用同数代入的方法,比如[1,1] 1为有效数字,则判断条件就是left<=right;[1,1) 1为无效数字,因此就应该是left<right。代码如下:

1.1 左闭右闭的写法

    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while (left <= right ) {
            int middle = (left + right ) / 2;
            if (nums[middle] > target ) {
                right = middle - 1;   // 因为是左闭右闭,所以判断完middle> target 右区间就不应该包含middle了
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }

}

1.2 左闭右开的写法

    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length;
        while (left < right) {
            int middle = (left + right) / 2;
            if (nums[middle] > target) {
                right = middle; // 因为左闭右开 所以右区间为middle
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }
}

2. 移除元素

image.png 题解: 移除等于val的元素,我们首先想到的就是新建一个空数组,遍历当前数组,把不等于val的放入另外一个数组中去,那么可不可以不创建新数组就能够实现呢?当然可以,比如我们可以采用双指针法,在该数组中i用于遍历整个数组,j指针用于标记不等于val的数,最后就可以把数组中等于val的元素移除掉了,代码如下:

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