JAVA二刷-DAY1 二分查找 + 移除元素

JAVA二刷-DAY1 | 二分查找 + 移除元素

二分查找

LeetCode题目链接:https://leetcode.cn/problems/binary-search/

解题思路

  二分查找的核心在于对边界问题的控制,因为要进行查找,所以要保证的是所查询的元素都是之前未见过的元素。同时还要保证把所有元素都进行遍历。因此,需要设定区间来完成该任务。当左闭右开时候,需要保证接下来的迭代均为左闭右开,二分查找才能完成完全的遍历。而左闭右闭的情况下,应当注意右边界的迭代需要mid - 1,以此避免遍历已经遍历过的元素。

  在取值上注意到左闭右开和左闭右闭的区别后,对于left 和 right之间的判定也需要搞清楚。当左闭右开的情况下,右值是不可能取得的。因此当left == right时,一定不可以取此时的mid值,因为违反了开区间的原则。因此此时为 (left < right)。而当左闭右闭的情况下,右值和左值都可以取到,因此 left == right也是可以允许的情况,因此此时为(left == right)

AC代码:

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

        return -1;

    }
}

移除元素

LeetCode题目链接:https://leetcode.cn/problems/remove-element

解题思路

数组元素在底层可以看做是一个连续的存放地址,因此删除数组中的元素,可以看成将这个元素以后的数组元素,进行逐个前移,将该元素覆盖。如果使用Vector容器的话,再将记录容器大小的size减一。自然就实现了代码的删除。

  基于原数组直接进行操作的代码,基本都可以考虑使用双指针来进行覆盖等操作。

  注意!java不能想c++一样直接对数组内存进行操作,即resize操作。本题目中可以直接返回减小后的长度,只读取数组指定的长度。如果需要返回的是一个数组,则需要重新创建一个新的数组,再进行上传。

使用快慢指针方法,要删去匹配的元素,即要覆盖掉匹配的元素,从另一种角度可以看成只留下不匹配的元素即可?
即,设置两个索引值,命名为快指针(fast)和慢指针(slow)。其中,快指针负责对数组进行遍历,寻找不匹配元素,慢指针则负责将不匹配的元素对原数组进行覆盖。覆盖就是删除嘛!
这样,最后就可以将原数组用不匹配的元素全部覆盖,同时slow指向新数组的末尾,可以直接作为size来输出。整体时间复杂度为 O ( n ) O(n) O(n)。代码如下:

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

你可能感兴趣的:(数据结构,java,开发语言)