力扣hot100题解(python版63-68题)

63、搜索插入位置

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

请必须使用时间复杂度为 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

思路解答:

1、采用二分查找

使用两个指针leftright来表示当前搜索范围的左右边界。在每次迭代中,我们计算中间元素的索引mid,并将目标值与中间元素进行比较。

  • 如果中间元素等于目标值,则直接返回中间元素的索引。
  • 如果中间元素小于目标值,则更新leftmid + 1,继续在右半部分搜索。
  • 如果中间元素大于目标值,则更新rightmid - 1,继续在左半部分搜索。

最终,当left > right时,表示搜索范围为空,此时left即为目标值应该插入的位置。

def searchInsert(nums: list[int], target: int) -> int:
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
        else:
            return mid

    return left

64、搜索二维矩阵

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

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

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

示例 1:

img

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

img

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

思路解答:(同题21)

  1. 从矩阵的右上角开始,如果目标值等于当前位置的值,则返回True。
  2. 如果目标值大于当前位置的值,则目标值一定在当前位置的下方或左方,因为当前位置向左和向下都是递增的。
  3. 如果目标值小于当前位置的值,则目标值一定在当前位置的左上方,因为当前位置向上和向右都是递增的。
  4. 重复上述步骤,直到找到目标值或者搜索完整个矩阵。
def searchMatrix(matrix: list[list[int]], target: int) -> bool:

    if not matrix or not matrix[0]:

        return False

    rows, cols = len(matrix), len(matrix[0])
    row, col = 0, cols - 1

    while row < rows and col >= 0:
        if matrix[row][col] == target:
            return True
        elif matrix[row][col] < target:
            row += 1
        else:
            col -= 1

    return False

65、在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

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

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

思路解答:

1、定义了两个辅助函数find_firstfind_last来分别查找目标值的起始位置和结束位置

  • find_first函数找到第一个大于等于目标值的位置。
  • find_last函数找到最后一个小于等于目标值的位置。

2、如果起始位置小于等于结束位置,则返回起始位置和结束位置;否则返回[-1, -1]表示目标值不存在于数组中。

def searchRange(nums: list[int], target: int) -> list[int]:
    def find_first(nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right + left) // 2
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left

    def find_last(nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right + left) // 2
            if nums[mid] <= target:
                left = mid + 1
            else:
                right = mid - 1
        return right

    start = find_first(nums, target)
    end = find_last(nums, target)

    if start <= end:
        return [start, end]
    else:
        return [-1, -1]

66、搜索旋转排序数组

整数数组 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) 的算法解决此问题。

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1], target = 0
输出:-1

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • nums 中的每个值都 独一无二
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

思路解答:

  1. 初始化左指针 left 和右指针 right,分别指向数组的起始位置和结束位置。
  2. 在一个循环中,不断将中间位置 mid 计算为 (left + right) // 2
  3. 如果 nums[mid] == target,表示找到了目标值,直接返回 mid
  4. 接下来判断左半部分是否有序(即 nums[left] <= nums[mid]),如果是有序的,就根据目标值是否在有序部分内来更新左右指针;如果左半部分无序,则根据目标值是否在右半部分有序部分内来更新左右指针。
  5. 不断循环直到 left > right,表示没有找到目标值,返回 -1。
def search(nums: list[int], target: int) -> int:

    left, right = 0, len(nums) - 1

    while left <= right:
        mid = (left + right) // 2

        if nums[mid] == target:
            return mid

        if nums[left] <= nums[mid]:  # 左半部分有序
            if nums[left] <= target < nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        else:  # 右半部分有序
            if nums[mid] < target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1

    return -1

67、寻找旋转排序数组中的最小值

已知一个长度为 n的数组,预先按照升序排列,经由 1到 n 次 旋转后,得到输入数组。例如,原数组

nums = [0,1,2,4,5,6,7]

在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素

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

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中的所有整数 互不相同
  • nums 原来是一个升序排序的数组,并进行了 1n 次旋转

思路解答:

  1. 初始化左指针 left 指向数组开头,右指针 right 指向数组末尾。
  2. 在每一步中,计算中间元素的索引 mid = (right + left) // 2
  3. 检查中间元素 nums[mid] 与最右边元素 nums[right] 的大小关系:
    • 如果 nums[mid] < nums[right],说明右半部分是有序的,最小元素可能在左半部分,因此将 right 移动到 mid
    • 如果 nums[mid] >= nums[right],说明右半部分是无序的,最小元素一定在右半部分,因此将 left 移动到 mid + 1
  4. 重复步骤 2 和步骤 3,直到 leftright 相遇,此时找到了最小元素。
def findMin(nums: list[int]) -> int:
    left, right = 0, len(nums) - 1

    while left < right:
        mid = (right + left) // 2

        if nums[mid] < nums[right]:  # 右半部分有序,最小值在左半部分或者就是当前位置
            right = mid
        else:  # 右半部分无序,最小值在右半部分
            left = mid + 1

    return nums[left]

68、寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

思路解答:

  1. 如果第一个数组的长度大于第二个数组的长度,则交换两个数组。
  2. 初始化一个极大值变量infinty,并分别获取两个数组的长度。
  3. 初始化left和right分别指向第一个数组的起始和结束位置,median1和median2初始化为0。
  4. 在left小于等于right的循环内,计算i和j,其中i表示第一个数组的分割点,j表示第二个数组的分割点。
  5. 根据i和j,获取四个数值nums_im1、nums_i、nums_jm1、nums_j,分别表示两个数组中的前一部分的最大值和后一部分的最小值。
  6. 如果nums_im1小于等于nums_j,则更新median1和median2的值,并将left更新为i + 1,否则将right更新为i - 1。
  7. 循环结束后,根据两个数组的总长度是奇数还是偶数,返回中位数的值。
def findMedianSortedArrays(nums1: list[int], nums2: list[int]) -> float:

    if len(nums1) > len(nums2):
        return findMedianSortedArrays(nums2, nums1)

    infinty = 2 ** 40
    m, n = len(nums1), len(nums2)
    left, right = 0, m
    # median1:前一部分的最大值
    # median2:后一部分的最小值
    median1, median2 = 0, 0

    while left <= right:
        # 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
        # // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
        i = (left + right) // 2
        j = (m + n + 1) // 2 - i

        # nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
        nums_im1 = (-infinty if i == 0 else nums1[i - 1])
        nums_i = (infinty if i == m else nums1[i])
        nums_jm1 = (-infinty if j == 0 else nums2[j - 1])
        nums_j = (infinty if j == n else nums2[j])

        if nums_im1 <= nums_j:
            median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)
            left = i + 1
        else:
            right = i - 1

    return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Blender中清理由Instant-NGP等几何学习技术生成的网格

使用布尔运算: 创建一个大的立方体或其他简单几何体包裹住全部网格。使用布尔修改器对两个网格进行“差集”运算。这将移除超出包裹体之外的多余网格部分。 手动选择并删除: 进入编辑模式&#xff08;按Tab键&#xff09;。按A键取消选择所有顶点。按B键并拖动以选择您想要删除…

【论文笔记】Language Models are Few-Shot Learners

Language Models are Few-Shot Learners 本部分是 GPT-3 技术报告的第一部分&#xff1a;论文正文、部分附录。 后续还有第二部分&#xff1a;GPT-3 的广泛影响、剩下的附录。 以及第三部分&#xff08;自己感兴趣的&#xff09;&#xff1a;GPT-3 的数据集重叠性研究。 回顾…

vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载

文章目录 导文文章重点内容效果展示&#xff1a;代码展示这些方法适用于哪些场景 总结 导文 vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载 文章重点 内容效果展示&#xff1a; 当div拉到底部的时候&#xff1a; 编辑器返回&#xff1a; 代码展示 在…

来点基础的吧,JavaScript、JSP怎么打印输出,方便调试

这个对初学者肯定有用&#xff0c;自己写了代码&#xff0c;想看看对不对&#xff0c;想打印到页面上看看&#xff0c;都有哪些地方需要打印用哪些方法呢&#xff1f; 一、JavaScript的打印输出 1、console.log() console.log()是JavaScript中最常用的打印值方法之一。它将指…

React-router之简单使用

1.概念 说明&#xff1a;页面的跳转 2.安装 说明&#xff1a;路由采用CRA创建项目的方式进行基础环境配置。 npx create-react-app react-router-pro npm i react-router-dom 3.使用 import React from react; import ReactDOM from react-dom/client; import ./index.css;…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络&#xff1a; 可以用来&#xff1a;数据传输、数据共享 1. 网络协议模型&#xff1a; 1. OSI协议模型&#xff1a; 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式&#xff08;数据包&#xff0c;流式&#xff09;网络层数据的…

C#学习:初识各类应用程序

编写我们第一个程序——Hello,World! 1.编程不是“学”出来的&#xff0c;而是“练”出来的 2.在反复应用中积累&#xff0c;忽然有一天就会顿悟 3.学习原则&#xff1a; 3.1从感官到原理 3.2从使用别人的到创建自己的 3.3必需亲自动手 3.4必需学以致用&#xff0c;紧跟实际…

大模型思维链(CoT prompting)

思维链&#xff08;Chain of Thought&#xff0c;CoT&#xff09; **CoT 提示过程是一种大模型提示方法&#xff0c;它鼓励大语言模型解释其推理过程。**思维链的主要思想是通过向大语言模型展示一些少量的 exapmles&#xff0c;在样例中解释推理过程&#xff0c;大语言模型在…

HTML 学习笔记(七)列表

html中的列表分为以下三种&#xff1a;有序列表&#xff0c;无序列表和自定义列表 1.有序列表 有序列表由两个元素组成&#xff1a;元素ol和元素li&#xff0c;此两个元素是父子关系&#xff0c;li必须包裹在ol里使用&#xff0c; ol里直接嵌套的只有li&#xff0c;其嵌套效果…

【亲身经历】linux中使用mv命令之后,文件找不到

先说解决方案&#xff1a;移动过程的目的目录&#xff0c;使用了"/",这个斜杠标识加到目录名前面&#xff0c;表示会移动到根目录下的文件夹&#xff0c;而不是你想移动的那个文件夹&#xff0c;最后导致没找到。 某次升级tomcat的过程中&#xff0c;使用了mv移动文…

ky10 server 银河麒麟服务器主备搭建 (nginx+keepalived)

下载脚本代码 git clone https://gitcode.net/zengliguang/nginx_keepalived_ky10_x.git 进入脚本路径 更新脚本代码 更新完成 执行安装脚本 安装nginx离线编译安装依赖 解压nginx源码 检查环境 编译 nginx安装成功 安装keepalived keepalived安装成功

详解前端登录流程:实现原理与最佳实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Mysql安装好后my.ini文件在何处

文章目录 报错 Invalid default value for ‘‘begin_time‘‘my.ini文件何在 背景&#xff1a;导入一个sql脚本时执行报错&#xff0c;需要修改my.ini中的一个配置 报错 Invalid default value for ‘‘begin_time‘‘ 需要修改my.ini中的slq-mode配置 参考的这个哥们博客配…

unityplayer.dll是什么,电脑缺少unityplayer.dll的解决方法分享

如何解决“缺失unityplayer.dll”错误&#xff1f;当您尝试启动一个应用程序或游戏时&#xff0c;您可能会看到一个错误消息&#xff0c;显示“找不到unityplayer.dll”或unityplayer.dll丢失。这通常是因为Unity引擎未正确安装或文件已丢失或损坏。这篇文章将向您介绍如何解决…

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…

Unity中PICO实现 隔空取物 和 接触抓取物体

文章目录 前言一、隔空取物1、XR Grab Interactable2、调节扔出去时的相关系数3、用手柄射线指向需要抓取的物体后&#xff0c;按下侧边扳机键即可抓取 二、接触抓取物体1、替换手柄上抓取物体的脚本2、在手柄上添加 接触抓取物体的脚本3、在手柄上添加碰撞盒触发器4、在需要抓…

BUUCTF-Misc6

数据包中的线索1 1.打开附件 发现是一个流量包 2.Wireshark 用Wireshark打开 右键属性&#xff0c;追踪tcp流&#xff0c;发现base64编码 3.base64转图片 将base64编码保存为文本文档 Python脚本 import os,base64 with open("/root/桌面/3/1.txt","r"…

安全防御-第七次

在FW5和FW6之间建立一条IPSEC通道保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 NAT&#xff1a; 安全策略&#xff1a; NAT: 安全策略&#xff1a; 修改服务器映射&#xff1a; 配置IPSEC&#xff1a;

SMT32 TIM1 PWM(发送固定脉冲数)步进电机梯形图加速

&#xff08;因为电机的启停惯性和步进电机越慢扭力越大的原因&#xff09;&#xff1b;所以步进电机使用梯形加速&#xff0c;可以实现更小的丢步 思路&#xff1a;在PWM中断中做计数&#xff0c;前20个脉冲和后20个脉冲频率设置一样低&#xff0c;中间的脉冲频率设置快一点

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…