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

2023-09-16 19:47:36

目录

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%

更多推荐

gRpc_go_dart-1.编写第一个服务

​通俗的讲下grpc简化掉所有复杂的实现,它要求服务端和客户端之间按照protobuf的规范进行数据交换,所以服务端和客户端都不用关心彼此的代码实现,只关心按照protobuf的形式提供数据为什么是go和dart技术栈,已经是google的形状了同时,go客户端和Flutter间本身通过http协议不好交接数据,用gr

Seata1.5.2解决分布式事务问题

分布式事务–Seata​前面了解到一些分布式事务的解决方案,业内也涌现出不少解决分布式事务的优秀框架,如Atomikos、Seata等,本章来了解使用下Seata。​Seata的前身是Fescar,而后改名Seata,简单可扩展的自治分布式事务框架。Seata为用户提供了AT、TCC、SAGA和XA事务模式(默认使用A

【学习笔记】各类基于决策单调性的dp优化

文章目录对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类与图形相结合决策单调性的常见优化手段二分队列二分栈分治类莫队做法SMAWKWQS二分+WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分的方案构造WQS外层二分时的边界Tips:斜率

容器【容器介绍、Set接口介绍、 HashSet容器的使用、TreeSet容器的使用】(三)-全面详解(学习总结---从入门到深化)

目录LinkedList容器介绍Set接口介绍HashSet容器的使用通过HashSet存储自定义对象TreeSet容器的使用LinkedList容器介绍LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理(PDM)解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用SOLIDWORKSPDMProfessional,您的团队能够:1.安全地存储和索引设计数据以实现快速检索;2.打消关于版本控制和数据丢失的顾虑;3.与多个地点的组织内外部的人员就设计进

Docker+jenkinsPipeline运行实现python自动化测试(超详细)

一、实现思路在Linux服务器安装docker创建jenkins容器jenkins中创建pipeline项目根据自动化项目依赖包构建python镜像(构建自动化python环境)运行新的python容器,执行jenkins从仓库中拉下来的自动化项目执行完成之后删除容器二、环境准备Linux服务器一台(我的是CentOS

[Docker精进篇] Docker镜像构建和实践 (三)

前言:Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中,以便在不同环境中快速、可靠地部署和运行应用程序。文章目录Docker镜像构建1️⃣是什么?2️⃣为什么?3️⃣镜像构建一、用现有容器构建新镜像二、Dockerfile构建镜像4️⃣总结这篇文章是我的笔记,旨在带您快速入门上手docke

Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示

Docker进阶:DockerCompose(容器编排)管理多容器应用—实战案例演示一、DockerCompose简介二、DockerCompose安装三、DockerCompose卸载四、DockerCompose核心概念4.1、一文件原则(docker-compose.yml)4.2、服务(service)4.3、

PostgreSQL快速入门 & 与MySQL语法比较

开篇本文可帮助具有MySQL基础的小伙伴对PostgreSQL做一个快速的入门,通过语法之间的差异对比,降低学习成本,同样都是数据库,正所谓触类旁通。模式的概念模式(Schema)表示数据库中的逻辑容器,用于组织和管理数据库对象,如表、视图、索引等。一个模式可以看作是一组相关对象的命名空间。模式不同于表,它更多地是对数

【Docker系列】Docker-核心概念/常用命令与项目部署实践

写在前面Docker是一种开源的容器化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现快速部署和高效运行。Docker的核心概念包括镜像、容器、仓库等。本文将详细介绍Docker的基本概念、安装方法以及常用命令。一、Docker基本概念介绍3个基础概念:镜像(Image)容器(Conta

JVM——2.JVM的内存结构

这篇文章来讲一下JVM中的重点之一——JVM的内存结构目录1.概述2.程序计数器3.虚拟机栈3.1栈的介绍3.2栈的相关问题3.3栈内存溢出问题3.4线程运行诊断4.本地方法栈5.堆5.1堆的概述5.2堆内存溢出问题5.3堆内存诊断6.方法区6.1方法区的概述6.2方法区的内存溢出问题7.运行时常量池8.直接内存8.1

热文推荐