代码随想录算法训练营二十四期第一天|LeetCode704. 二分查找、LeetCode27. 移除元素

一、LeetCode704. 二分查找

题目链接:704. 二分查找
二分查找,一般用于查找有序数组中与目标值相等的元素。利用双指针的思想来解决。
首先定义左右两个指针,分别从数组的开头和尾部开始,然后用一个while循环来进行反复搜索。
循环中首先定位中间的元素,既mid = (right + left) / 2。然后比较中间的元素与目标值的大小关系重新确定左右指针的位置以及找到之后返回数组下标。
当中间值nums[mid] == target,直接返回下标。
因为这道题目给我们的数组是升序,所以当nums[mid] > target时表明目标值的位置不可能出现在mid的右方,所以要在mid左方区间的位置去搜索,于是将right = mid - 1然后继续循环。
同理当nums[mid] < target时表明目标值在mid的右方位置(也有可能不在数组中),left = mid +1,然后到区间left~right继续搜索。
如果在数组中找不到目标值则,就要跳出循环,然后返回-1,那么跳出循环的条件是什么呢,当用循环在不断搜索的时候,left和right的位置是不断向着互相靠拢的,当他们相遇的时候记说名已经在数组当中搜索完了,所以循环的条件为while(left < right);
以下为代码:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;//左指针
        int right = nums.length - 1;//右指针

        while(left <= right) {
            int mid = left + (right - left) / 2;//取中间位置,注意left+right可能会导致数据溢出,所以最好用left + (right - left)/2
            if(nums[mid] == target) {//如果找到目标值,直接返回下标
                return mid;
            }else if(nums[mid] > target) {//如果中间位置的值大于目标值,right = mid - 1
                right = mid - 1;
            }else {//如果中间位置的值小于目标值,left = mid + 1;
                left = mid + 1;
            }
        }
        return -1;//找不到目标值返回下标

    }
}

二、LeetCode27. 移除元素

题目链接:27. 移除元素
这道题需要注意的是不仅需要返回新数组的长度,最重要的是要原地对数组进行目标元素的删除(用新数组中的成员来覆盖,超过新数组的部分不用管)。
我们要定义快慢两个指针来遍历数组,从数组首部开始,快指针先出发要找数组中不等于目标值val的元素,然后用慢指针来接收这些元素,等快指针遍历完数组(慢指针永远不会超过快指针),移除等于目标值的元素的任务结束。
最后新数组的长度即是慢指针到达的下标位置。
代码如下:

class Solution {
    public int removeElement(int[] nums, int val) {
        int low = 0;
        int fast = 0;//定义快慢双指针
        for(; fast < nums.length; fast++) {//快指针遍历数组
            if(nums[fast] != val) {//快指针找到不等于val的元素,将其赋值给慢指针,然后慢指针走一步
                nums[low++] = nums[fast]; 
            }
        }
        return low;//慢指针所到达的位置的小标就是新数组的长度

    }
}

总结

这一次来二刷有了不一样的体会,从当初毫无经验的小白,到现在对算法有了一定的认知和了解,这过程有艰难和辛酸,也有收获和满足。
不过我觉得最重要的还是要坚持,每天刷题、写博客都会给自己带来想不到的益处。

你可能感兴趣的:(Java算法题解,算法,数据结构,java,leetcode)