草庐IT

力扣刷题01

z轩 2023-03-28 原文

704.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。
class Solution {
    public int search(int[] nums, int target) {
        int l=0;
        int r=nums.length-1;
        while(l<=r){
            int mid=l+(r-l)/2;
            if(nums[mid]<target){
                l=mid+1;
            }else if(nums[mid]>target){
                r=mid-1;
            }else if(nums[mid]==target){
                return mid;
            }
        }
        return -1;
    }
}

反思

该题自以为已经熟练掌握,但是在写的时候还是卡住我了。

第一是对于目标值和中间元素的比较,我直接使用的是mid与target值的比较,实际应该是用nums数组对应mid下标的值与target对比。

第二是关于边界元素的确定,在比较target>nums[mid]时,我错误的将边界元素写成了r=mid-1.实际上在纸上一画便知,边界元素应该是:取数组mid右边的元素,所以应该改变l的取值,l=mid+1;同理tareget<nums[mid]时,应该写成r=mid-1。

278. 第一个错误的版本

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例 1:

输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false 
调用 isBadVersion(5) -> true 
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。

示例 2:

输入:n = 1, bad = 1
输出:1

提示:

  • 1 <= bad <= n <= 231 - 1

思路

同样这道题是利用二分法来做,给定一个n长度的版本,需要找到出错的第一个版本,那么利用二分,当调用isBadVersion时,若返回true,则应该向左侧继续查找;若返回false,则证明出错的在右侧,应像右侧查找

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int l=0;
        int r=n;
        while(l<r){
            int mid=l+(r-l)/2;
            if(isBadVersion(mid)){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        return r;
    }
}

反思

思路很好想到,但这道题不同于上一道题的二分判断。该题在于设置了l=0,r=n,那么当你选择中间值时,mid=l+(r-l)/2;判断mid处的版本是否为出错版本,若是出错版本,则应该往左侧查,这样就令r=mid即可,因为你不确定这个mid处的版本是否就是出错的第一个版本,所以要把右边界设置为mid;那么同理既然已经判断过mid处了,则如果判断返回false,则向右侧查时,左边界应该为mid+1.

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums无重复元素升序 排列数组
  • -104 <= target <= 104
class Solution {
    public int searchInsert(int[] nums, int target) {
        int l=0;
        int r=nums.length-1;
        while(l<=r){
            int mid=l+(r-l)/2;
            if(nums[mid]<target){
                l=mid+1;
            }else if(nums[mid]>target){
                r=mid-1;
            }else if(nums[mid]==target){
                return mid;
            }
        }
        return l;
    }
}

反思

该题的关键在于当你找的target值不在数组时,应该插到哪个位置。

依照二分法进行演草,可以知道,如果不在数组,那么每次的递归遍历总是要将target值插入l位置处。

例如 1 2 4 5 6 target=3时,在最后的l=2,正好跳出while循环,返回的l值恰好是所插入的位置。

有关力扣刷题01的更多相关文章

  1. day1-数组part01| 704. 二分查找、27. 移除元素 - 2

    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组下标从0开始数组内存空间的地址是连续的c++中vector和array的区别1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其内存空间大小是能够改变的。2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的内存空间是固定大小的,申请之后就无法改变。3、vector的底层是array实现的二维数组二维数组在内存的空间地址是连续的704|二分查找思路1、把整个数组一分为二;2、判断目标值在左区间还是右区间,若在左区间,则修改右区间指针的位置;若在右区间,则修改新区间的左区间位置3、重复上述过程,直到lef

  2. 面试总结+力扣第二天刷题 - 2

    一.面试总结    4月20号下午进行了一场大数据视频面试,总结一下踩坑点:    1.确定面试后,第一件事要和HR确定面试方式,具体时间、地点、什么软件、岗位JD等必须信息。        这里很多人有一个思想误区,认为问的太多会给HR不好的印象;其实大可不必,如果你通过了简历筛选,你就有权力使用公司招聘的人力资源。    2.要在面试10分钟前就进入面试的环境中,以防突发事件。    3.面试最开始都会有一个自我介绍环节,这个自我介绍环节,一定要慎之又慎,最好写下来,让朋友、长辈等审核多遍。    注:我面试时,在这踩了一个坑,自我介绍的时候踩了我要面试的岗位一脚,被技术面试官抓住了这一点

  3. javascript - 具有 0.01 个步骤的数字输入为 angularjs 中的某些值提供未定义 - 2

    在angularjs(1.6.1)中使用该类型的输入,为9.03到9.05之间的值提供undefined。使用其他值时会重现此问题,其中包括9.62、9.63、17.31。这fiddle重现问题。只需在数字输入中单击向上即可。在linuxmint18下的firefox和chromium上测试。它似乎链接到"step"属性。如果设置为"0.001"就没有问题。但是我在这个应用程序中威胁金钱,所以需要2位小数。注意:如果值最初通过data-numeric-value设置为9.03,则它不是未定义.这个错误有什么解决方法吗?编辑已更新fiddle显示step="0.01"与step="0.0

  4. javascript - (新日期 ('2012-12-01' )).getMonth() === 10? - 2

    (newDate('2012-12-01')).getMonth()是10而不是11(getMonth是从0开始索引的)。我已经在Firefox、Chrome和Node.js上进行了测试。为什么会这样? 最佳答案 您遇到时区问题。您的JS引擎将字符串解释为UTC,因为它没有进一步指定。来自specificationofDate.parse(由newDate使用):TheStringmaybeinterpretedasalocaltime,aUTCtime,oratimeinsomeothertimezone,dependingont

  5. 【SpringBoot项目】SpringBoot项目-瑞吉外卖【day01】 - 2

    文章目录前言软件开发整体介绍软件开发流程瑞吉外卖项目介绍项目介绍产品原型展示技术选型功能架构角色开发环境搭建数据库环境搭建maven项目搭建设置静态资源映射后台登录需求分析代码开发功能测试后台退出需求分析代码开发功能测试🌕博客x主页:己不由心王道长🌕!🌎文章说明:SpringBoot项目-瑞吉外卖【day01】🌎✅系列专栏:SpringBoot项目🌴本篇内容:对黑马的瑞吉外卖项目的day01进行笔记和项目实现🌴☕️每日一语:人有退路,就有些许安全感。等到哪一天,你真没了退路,你就发现眼前哪条路都能走,也能通。☕️🚩交流社区:己不由心王道长(优质编程社区)前言从今天开始,正式进入项目阶段。本次的

  6. t01_idea消除的白框 - 2

    消除idea顶部窗口上的白色标题栏点击Hlep,找到EditCustomVMOptions...点击添加下面一段话(如果有责显示为false责改为true):-Dide.win.frame.decoration=true然后重启即可,如下图所示,顶部白框已经没有出现了

  7. Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用) - 2

    前言一个需求需要利用Python+第三方库wxauto用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理,比如自动回复,再比如自动发送文件或者其他。这边使用Python的第三方库`wxauto`来进行开发,而不是`itchat` ---记录于2022年07月 ---2023年1月再次测试可用使用Python3的第三方库wxauto,它适用于Windows的微信客户端官网:https://github.com/cluic/wxauto原因这边使用wxauto来进行开发,而不是itchat,原因如下itchat都是之前的教

  8. javascript - IE9 中的 Jquery 2.1.1 出现错误 : 0x800a01b6 - Microsoft JScript runtime error: Object doesn't support property or method 'addEventListener' - 2

    使用VisualStudio2013,我将一个混合的Asp.NetWebforms/MVC3Web应用程序迁移到Asp.NetWebforms/MVC5.1。作为迁移的一部分,我使用NuGet包管理器将Jquery从1.9.1升级到2.1.1。当我在Chrome的VisualStudio2013调试器中运行应用程序时,我没有遇到任何问题。当我在IE9的VisualStudio2013调试器中运行应用程序时(兼容模式未打开),首先加载带有这两个脚本标记的母版页:由于此Javascript错误而失败:Unhandledexceptionatline3425,column4inhttp://

  9. javascript - 日期 ('2015-1-1' ) 输出不同于日期 (2015-01-01) - 2

    我刚刚发现如果我使用newDate('2015-1-1'),时间是没有时区影响的,但是如果我使用newDate('2015-01-01')时间在Node.js中具有时区效果。我输出4Date():console.log(newDate('2015-1-1'));console.log(newDate('2015-01-1'));console.log(newDate('2015-1-01'));console.log(newDate('2015-01-01'));输出是ThuJan01201500:00:00GMT+0800(CST)ThuJan01201500:00:00GMT+08

  10. 使用小度音箱+Blinker控制ESP01S Relay继电器模块 - 2

    一.使用ESP01S模块,PIN脚定义如下:管脚功能如下:ESP01S模块原理图:ESP01S模块比ESP01模块做了以下优化:LED灯的管脚发生变化,由ESP01的TXD0变成ESP01s的GPIO2引脚;ESP01s模块的IO0、RST、EN引脚上加了上拉电阻,也就是说在连接了3v3引脚后这三个引脚也自动连接上高电平,无需再EN引脚上外接高电平。ESP01模块外接引脚图:ESP01S模块外接引脚图:二.继电器模块选择:使用以下所示隔离款继电器模块原理图如下:模块使用GPIO0驱动继电器,但是ESP01S模块在上电时GPIO0会不受控制翻转,网上很多建议加电容但是效果不是很好,这里直接使用R

随机推荐