【LeetCode-面试经典150题-day24】

2023-10-30

目录

35.搜索插入位置

 74.搜索二维矩阵

 162.寻找峰值

 33.搜索旋转排序数组


 

35.搜索插入位置

题意:

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

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

【输入样例】nums = [1,3,5,6], target = 5

【输出样例】2

解题思路:最简单的二分查找,给定的是排序数组,直接根据数组下标,找到范围内的中点,并与target比较,如果比target大,则缩小查找范围为左区间;如果比target笑,缩小查找范围为右区间;如果相等,直接返回。

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

        }
        return l;
        
    }
}

时间: 击败了100.00%

内存: 击败了82.77%

 74.搜索二维矩阵

题意:

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非递减顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

【输入样例】matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3

【输出样例】true

解题思路:原理与上一题一样,不过这里变成了二维矩阵。按照题目的要求,可以把二维矩阵看成一维数组,直接用上一题的方法,要注意的是下标之间的转换;

矩阵有m行n列,则在一维矩阵中,中间索引为mid,对应二维矩阵中的坐标为:

i = mid / n;//一行多少个数,能有多少整行

j = mid % n; //剩下当前行中有多少列

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;
        int low = 0, high = m * n - 1;
        while(low <= high){
            //这里有个坑,就是二维数组跟一维数组还不太一样,这里直接除之后还需要加上low
            //加上low的特殊原因是保证mid可以代表其在一维数组中的真实坐标
            int mid = (high - low) / 2 + low;
            int x = matrix[mid/n][mid % n];
            if(x < target){
                low = mid + 1;
            }else if(x > target){
                high = mid - 1;
            }else{
                return true;
            }
        }
        return false;
    }
}

时间: 击败了100.00%

内存: 击败了95.25%

 162.寻找峰值

题意:

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

【输入样例】nums = [1,2,3,1]

【输出样例】2

解题思路:寻找最大值。

class Solution {
    public int findPeakElement(int[] nums) {
        int n = nums.length;
        int max = 0;
        for(int i=1;i<nums.length;++i){
            if(nums[i] > nums[max]){
                max = i;
            }
        }
        return max;
    }
}

时间: 击败了100.00%

内存: 击败了95.66%

 33.搜索旋转排序数组

题意:

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

【输入样例】nums = [4,5,6,7,0,1,2], target = 0

【输出样例】4

解题思路:先二分查找找到mid,如果left<mid,证明[left,mid]范围是有序的,还是用传统的二分查找找;否则[left,mid]无序,重新进行分割。

对于[mid,right]也是如此,如果mid<right,继续查找;否则还是继续分割。

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

时间: 击败了100.00%

内存: 击败了80.30%

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode-面试经典150题-day24】 的相关文章

随机推荐

  • MySQL之explain 的type列 & Extra列

    explain 可以分析 select 语句的执行 即 MySQL 的 执行计划 一 type 列 MySQL 在表里找到所需行的方式 包括 由左至右 由最差到最好 All index range ref eq ref const syst
  • QT 基础布局类总结

    文章目录 系列文章目录 前言 一 水平布局 二 垂直布局 三 网格布局 总结 前言 1 水平布局 垂直布局 网格布局均放置于QGroupBox中 2 继承QWidget类 在构造函数中调用setLayout 函数 即可完成布局 一 水平布局
  • 经典面试智力题200+题和解答

    招聘时期到了 总少不了需要准备智力题 考来考去大多是各种旧题 本来是考智力的事情 现在几乎已经变成了题海战术的考试 所以我们也不能在这一块落后 学习各种奇巧淫技 扩展一下思路 同时免得笔试面试吃亏 搜集了大量智力题 有些还挺有意思 顺便活跃
  • EnPass+WebDAV(一个跨平台密码管理解决方案)

    使用 EnPass密码管理软件 和 坚果云WebDAV 服务来搭建一个跨平台的密码管理方案 前言 相信很多人仍然处于 一个密码走天下 这一状态 但这种情况在当今互联网时代无异于裸奔 各种服务器漏洞造成的密码泄露 还有 撞库 等连锁反应 所以
  • 如何巧妙拒绝别人,搭配Online有小妙招

    相信很多人都会有拒绝别人的烦恼 一旦开口拒绝 难免会得罪人 如果答应下来 自己又无力帮助 这时往往存在矛盾冲突关系 那么如何解决这个问题呢 搭配Online提醒您要注意巧妙拒绝方面的技巧啦 1 耐心倾听对方的请求 即使心里清楚自己最后要拒绝
  • 新榜

    在过去的一个月中 淄博烧烤的相关话题霸屏网络 这些媒介话题里承载了多少受众的向往与想象 根据2022年淄博市文旅局公开年报 去年 淄博官方就着力融媒体 在抖音 快手等平台创新使用 淄博到底有多牛 主题形式 通过视频内容和文案策划 长效推广淄
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 区块链的数据是存储在链上,还是在数据库中?(答案是这个问题并不成立,来一起了解一下吧)

    很多人都想了解区块链的数据到底什么时候是存储在链上 什么时候又储存在相应节点的数据库中间呢 今天我们就来解决这个有趣的问题 首先我们必须了解清楚两个概念 区块链数据 链上数据 首先 区块链数据包括区块数据和状态数据两者 区块数据描述的实际是
  • hive分区表详细介绍

    一 什么是分区表以及作用 数据分区的概念以及存在很久了 通常使用分区来水平分散压力 将数据从物理上移到和使用最频繁的用户更近的地方 以及实现其目的 hive中有分区表的概念 我们可以看到分区具重要性能优势 而且分区表还可以将数据以一种符合逻
  • Datalore安装使用教程

    发现一个jetbrain出的好东西 使用体验完爆jupyter notebook以及jupyter lab的软件 就是安装有点复杂 官网写得有点不清楚 这里简单介绍一下 首先他只能在linux运行 其他环境暂时不支持 首先 去https w
  • react简要分析

    一 简介 前段时间看到一个用33行代码就实现了一个非常基本的react代码 感觉还是蛮有趣的 代码如下 其主要实现了两大功能 生成虚拟DOM 根据虚拟DOM渲染出真实的DOM 无注释版 https github com leontrolsk
  • linux下查看物理CPU个数、核数、逻辑CPU个数

    cat proc cpuinfo中的信息 processor 逻辑处理器的id physical id 物理封装的处理器的id core id 每个核心的id cpu cores 位于相同物理封装的处理器中的内核数量 siblings 位于
  • 消息队列中间件 - 详解RabbitMQ6种模式

    RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式 简单模式 工作模式 订阅模式 路由模式 主题模式 RPC模式 进行场景和参数进行讲解 PHP代码作为实例 安装 客户端实现 添加扩展 执行composer phar inst
  • 《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

    1 以太网 1 1 介绍 以太网是现实世界中最普遍的一种计算机网络 以太网有两类 第一类是经典以太网 第二类是交换式以太网 使用了一种称为交换机的设备连接不同的计算机 经典以太网 是以太网的原始形式 运行速度从 3 10 Mbps 不等 交
  • 51单片机实战 1 --四个独立按键控制四位数码管

    本文基于普中51开发板 在其例程代码稍加改动而成的 单片机的入门小项目也很益智 启动单片机 四位数码管显示0000 按下s1并松开 显示1000 再按下s1并松开显示2000 连续10次按下并松开s2 数码管显示2100 2200 2300
  • WSL安装图形界面

    效果如下 1 下载并安装VcXsrv 链接如下 https sourceforge net projects vcxsrv 下载完安装一路next即可 或者自行选择安装路径 2 安装桌面环境 安装xfce4 terminalsudo apt
  • mysql的锁

    锁 锁机制用于管理对共享资源的并发访问 用来实现事务的隔离级别 锁类型 共享锁和排他锁都是行级锁 MySQL当中事务采用的是粒度锁 针对表 B 树 页 B 树叶子 节点 行 B 树叶子节点当中某一段记录行 三种粒度加锁 共享锁 S 可理解为
  • Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

    目录 前言 1 添加特有属性 方法 示例1 添加特有属性 示例2 添加特有方法 2 私有属性 方法 1 私有化示例 2 私有化属性 方法可以在类的内部使用 3 强制访问私有化属性 方法 4 property装饰器去操作私有属性 方法 总结
  • 【测试入门】测试用例经典设计方法 —— 因果图法

    01 因果图设计测试用例的步骤 1 分析需求 阅读需求文档 如果User Case很复杂 尽量将它分解成若干个简单的部分 这样做的好处是 不必在一次处理过程中考虑所有的原因 没有固定的流程说明究竟分解到何种程度才算简单 需要测试人员根据自己
  • 【LeetCode-面试经典150题-day24】

    目录 35 搜索插入位置 74 搜索二维矩阵 162 寻找峰值 33 搜索旋转排序数组 35 搜索插入位置 题意 给定一个排序数组和一个目标值 在数组中找到目标值 并返回其索引 如果目标值不存在于数组中 返回它将会被按顺序插入的位置 请必须