代码随想录算法训练营第一天| 704.二分查找、27.移除元素

LeetCode704.二分查找

链接:(704.二分查找)
题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

代码随想录算法训练营第一天| 704.二分查找、27.移除元素_第1张图片

题目就叫二分查找,我们自然就知道这道题用二分查找来解决,通过这道题,我们也可以发现使用二分查找的一个条件:**数组有序,且数组中各元素不重复**

 很容易可以写出如下代码:

public int search(int[] nums, int target) {
        if(nums.length==0 || targetnums[nums.length-1]){
            return -1;
        }
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int mid=left+((right-left)>>1);
            if(nums[mid]target){   //target在mid左边
                right=mid-1;
            }else{
                return mid;
            }
        }
        // 没找到
        return -1;
    }

测试用例:
1.target 2.target>nums[nums.length-1]
3.nums[0] 4.nums[0] 5.nums为空

 LeetCode27.移除元素

链接:27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

代码随想录算法训练营第一天| 704.二分查找、27.移除元素_第2张图片 

看到这个题目,我脑子里没有啥空间复杂度为O(1)的解法,那就用暴力吧,暴力解法就是两个for循环,如下 

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

难道就没更好的解法了吗,我去看了题解,恍然大悟,答案就是双指针,

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

代码如下: 

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

测试用例:

1.数组中包含要移除的元素

2.数组中不包含要移除的元素

3.数组中只有要移除的元素

4.数组中没有元素

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