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

LeetCode 704  二分查找

题目链接 704 二分查找 

文章讲解链接 代码随想录

视频讲解链接 https://www.bilibili.com/video/BV1fA4y1o715

自己写的代码:

class Solution {
    public int search(int[] nums, int target) {
    
    int left = 0;
    int right = nums.length-1;//定义了target在左闭右闭的区间里;如果是nums.length,则是左闭右开的区间
    // if(target < nums[left] || target > nums[right]){
    //     return -1;
    // }
    while(left <= right){
        int mid = left + (right - left ) / 2; // 防止溢出 等同于(left + right)/2
        if(nums[mid] > target){
          right = mid -1;  
        }
        else if(nums[mid] < target){
            left = mid + 1;
        }else{
            return mid;
        }
    }
    return -1;
    }
}

 该题注意点:

①:左闭右闭区间的时候,while(left<=right),可以取left = right,可举例解释[1,1]是合法区间;

左闭右开的时候,while(left<right),[1,1)是不合法区间。

② 左闭右闭时,if(nums[mid] > target) right = mid -1 ;因为不存在重复的值,所有mid索引对应的值不会等于target;若right = mid ,由于已经判断出mid > target了,再把不是自己搜索区间的值又放到下一个循环,就会有问题了。

题解的代码:

class Solution {
    public int search(int[] nums, int target) {
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
        }
        return -1;
    }
}

写代码时遇到的问题:

① 应当考虑到target小于0索引和最大索引时的情况;

mid的赋值运算声明应当在while循环内;

③ 为了防止int型溢出,使用left+(right-left)/ 2,等同于使用(left+right)/ 2。

 LeetCode 27  移除元素

题目链接  27 移除元素

文章讲解 代码随想录

视频讲解 https://www.bilibili.com/video/BV12A4y1Z7LP

该题思路:如果fast指针的值不等于val的值,则slow指针会停止不动,不会再做自增的操作,而fast指针还会因for循环进行自增的操作,这样就会形成一个错位的fast指针对slow指针的赋值,这样可以避开数组中等于val的值,继而用下一个值去覆盖数组中等于val的值。

数组中的删除操作实际上是后面元素往前覆盖的操作。

自己写的代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0; //slow,fast都代表数组的索引
        for(int fast=0; fast < nums.length; fast++){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }

        }
        return slow; //返回数值是整数,输出的答案是数组
    }
}

题解的代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}

写代码时遇到的问题:该题理解起来较容易,代码也简洁,没遇到问题。

今日学习时长:3小时。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值