数组-二分查找-搜索插入位置/在排序数组中查找元素的第一个和最后一个位置/x 的平方根/有效的完全平方数

news2025/2/23 13:10:15

二分查找

35搜索插入位置

https://leetcode.cn/problems/search-insert-position/submissions/

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        l = 0
        r = len(nums)-1
        # // 整数除法 int /浮点数除法
        while(l<=r):
            mid = l + (r - l)//2
            if nums[mid] > target:
                r = mid - 1
            elif nums[mid]< target:
                l = mid + 1
            else:
                return mid
        # 因为l>r 
        # 跳出循环 有可能插入在数组的末端 即此时下标 l=len(nums)-1 + 1(多插入的位置), r=l-1
        # 因此返回的是数组末端最后 
        """
        // 分别处理如下四种情况
        // 目标值在数组所有元素之前 [0,0)
        // 目标值等于数组中某一个元素 return middle
        // 目标值插入数组中的位置 [left, right) ,return right 即可
        // 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right
        """
        return r + 1
// 第一种二分法
func searchInsert(nums []int, target int) int {
    l, r := 0, len(nums) - 1
    for l <= r{
        m := l + (r - l)/2
        if nums[m] == target{
            return m
        }else if nums[m] > target{
            r = m - 1
        }else{
            l = m + 1
        }
    }
    return r + 1
}

https://programmercarl.com/0035.%E6%90%9C%E7%B4%A2%E6%8F%92%E5%85%A5%E4%BD%8D%E7%BD%AE.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC

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

给你一个按照非递减顺序排列的整数数组 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]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 
class Solution(object):
    def find_left(self,nums,target):
        l=0
        r=len(nums)-1
        while l<=r:
            mid=(l+r)//2
            # 如果找到了 继续找左边界 找第一个>=target 的值
            if nums[mid]==target:
                r=mid-1
            elif nums[mid]>target:
                r=mid-1
            else:
                l=mid+1
        # 因为l>r 此时跳出循环 r条件是mid-1 有可能是第一种nums[mid]==target的情况 
        # 所以看看l是不是符合(因为此时l=r+1 所以l有可能是mid )  
        if nums[l]== target:
            return l;
        else:
            return -1;

    def find_right(self,nums,target):
        l=0
        r=len(nums)-1
        while l<=r:
            mid=(l+r)//2
            # 如果找到了 继续找右边界 找最后一个<=target 的值
            if nums[mid]==target:
                l=mid+1
            elif nums[mid]>target:
                r=mid-1
            else:
                l=mid+1
        # 因为l>r 此时跳出循环 l条件是mid+1 有可能是第一种nums[mid]==target的情况 
        # 所以看看r是不是符合(因为此时l-1=r 所以r有可能是mid )  
        if nums[r]== target:
            return r;
        else:
                return -1;

    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        

        # 数组递增 最后一个数比target小 或者第一个数比targe大
        if len(nums)==0 or nums[0]>target or nums[-1]<target:
            return[-1,-1]
        ll=self.find_left(nums,target)
        rr=self.find_right(nums,target)

        return[ll,rr]

func find_left(nums []int, target int) int {
    l := 0
    r := len(nums) - 1
    for l <= r{
        mid := l + (r - l)/2 
        if nums[mid] > target{
            r =  mid -  1
            
        }else if nums[mid] ==  target{
            r = mid  - 1

        }else{
            l = mid + 1
        }
    
    }
    if nums[l] == target{
        return l
    }else{
        return -1
    }

}
func find_right(nums []int, target int) int {
    l := 0
    r := len(nums) - 1
    for l <= r{
        mid := l + (r - l)/2 
        if nums[mid] > target{
            r =  mid -  1
            
        }else if nums[mid] == target{
            l = mid + 1
        }else{
            l = mid + 1
        }
    
    }
    if nums[r] == target{
        return r
    }else{
        return -1
    }

}
func searchRange(nums []int, target int) []int {
    if len(nums) == 0||nums[0]>target||nums[len(nums)-1]<target{
        return []int{-1, -1}
    }else{
        ll:=find_left(nums,target)
        rr:=find_right(nums,target)
        return[]int{ll,rr}
    }
}

69.x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4 输出:2
示例 2:

输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
在这里插入图片描述

class Solution:
    def mySqrt(self, x: int) -> int:
        l = 0
        r = x
        res = 0
        while l<=r:
            mid = l+(r-l)//2
            # 因为是取整,所以mid*mid不会更好等于x 所以会在这个过程中一直更新res,
            # 小于的情况,就是往右边找mid,扩大mid
            # =的情况,res就刚好是mid,找到了x的平方根
            if mid*mid <= x:
                res = mid
                l = mid + 1
            else:
                r = mid -1
        return res
func mySqrt(x int) int {
    l:=0
    r:=x
    res:=0
    for l <= r{
        mid := l + (r - l)/2
        if mid * mid <= x{
            res = mid
            l = mid + 1
        }else{
            r = mid - 1
        }
    }
    return res

}

367.有效的完全平方数

给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。

不能使用任何内置的库函数,如 sqrt 。

示例 1:

输入:num = 16 输出:true 解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:

输入:num = 14 输出:false 解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742
不是一个整数。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/valid-perfect-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        l = 0
        r = num
        res = 0
        while l<=r:
            mid = l+(r-l)//2
            # 因为是取整,所以mid*mid不会更好等于x 所以会在这个过程中一直更新res,
            # 小于的情况,就是往右边找mid,扩大mid
            # =的情况,res就刚好是mid,找到了x的平方根
            if mid*mid <= num:
                res = mid
                l = mid + 1
            else:
                r = mid -1
        # 判断是不是整数相乘
        if res * res == num:
            return True
        else:
            return False
func isPerfectSquare(num int) bool {
    l:=0
    r:=num
    res:=0
    for l <= r{
        mid := l + (r - l)/2
        if mid * mid <= num{
            res = mid
            l = mid + 1
        }else{
            r = mid - 1
        }
    }
    if res * res == num{
        return true
    }else{
        return false
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础43 异常(Exception)

异常&#xff08;Exception&#xff09;Exception1.1 异常的概念1.2 异常体系图&#xff08;☆&#xff09;1.3 异常处理分类1.3.1 运行时异常&#xff08;☆&#xff09;1.3.2 编译时异常&#xff08;☆&#xff09;1.4 异常处理&#xff08;☆&#xff09;1.4.1 try-catch异常…

关于联想Y7000P睡眠后无法唤醒问题修复

这个新的机器是WINDOWS11的&#xff0c;症状了自己睡眠后就醒不过来了&#xff0c;于是我找到了公众号&#xff0c;提示下载一个软件修复驱动&#xff0c;http://tools.lenovo.com.cn/tools/exeTools/download?tool_id233但是执行后还是发现有问题&#xff0c;而且比较诡异于是…

【C++】秋招实习面经汇总篇

C面经汇总 系列综述&#xff1a; 目的&#xff1a;本系列是个人整理为了秋招和实习面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡背诵量与深入程度。 来源&#xff1a;材料主要源于阿秀的笔记和《王道考研复习指导》进行的&#xff0c;每个知识点的修正和深入主要…

MySQL索引篇

文章目录说明&#xff1a;索引篇一、索引常见面试题按数据结构按物理存储分类按字段特性分类按字段个数分类索引缺点&#xff1a;什么时候适用索引&#xff1f;什么时候不需要创建索引&#xff1f;常见优化索引的方法&#xff1a;发生索引失效的情况&#xff1a;二、从数据页角…

C#把图片放到picturebox上的指定位置,PointToClient与PointToScreen解读

1、C#中如何把图片放到picturebox上的指定位置 构造一个跟picturebox1一样大小的Bitmap&#xff0c; 设置给picturebox1&#xff0c; 然后在上面画图 Bitmap image new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height); Graphics device Graphics.FromImage(imag…

FPGA电源电流参数

一、FPGA里各个电源释义 VCCINT VCCINT是FPGA芯片的内核电压&#xff0c;是用来给FPGA内部的逻辑门和触发器上的电压。即芯片的晶体管开关是有核心电压提供。当内部逻辑工作时钟速率越高&#xff0c;使用逻辑资源越多&#xff0c;则核心电压供电电流会更大&#xff0c;可高达几…

【halcon】模板匹配和仿射变换总结

前言 模板匹配和仿射变换&#xff0c;经常一起使用&#xff0c;他们之前的位置变换一般有两种情况&#xff01; 情况一 模板是一个很正的图&#xff0c;利用模板的位置&#xff0c;将歪的图像摆正。 情况二 模板和图片正不正都无所谓&#xff0c;只需想模板的位置&#xff0…

内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…

进程间同步

并发 线程和进程都是一个调度的单位 并发进程之间的关系 交互关系之间的关系是很复杂的&#xff0c;假如一个进程需要等待另外一个进程的调用才可以运行&#xff0c;就如下面这个例子 竞争关系 上面这个区叫做临界区域 协作方式 前面我们说过异步和同步的概念 那么异…

算法笔记(十一)—— 并查集、KMP

并查集 支持集合快速合并 所有数据生成各自的集合&#xff0c;需要提供查询两个两素是不是属于一个集合&#xff0c;和集合合并操作&#xff0c;并查集能够在常数时间级别上对两个操作进行实现 1. 构造结构&#xff08;数据指针&#xff09;&#xff0c;将自己的指针指向自己…

激光雷达介绍

全球汽车行业正在进行自动化变革&#xff0c;这将彻底改变交通运输的安全和效率水平。戴姆勒在S级豪华车型中引入L3级自动驾驶&#xff08;L3&#xff0c;在特定条件下自动驾驶&#xff0c;人类驾驶员一旦被请求就会随时接管&#xff09;是自动驾驶革命的一个重大突破。其他多家…

浅谈SQL中的union和union all

文章目录概念基础语法使用技巧区别总结概念 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。 UNION 操作符选取不同的值&#xff0c;如果允许得到重复的值&#xff0c;可以使用 UNION ALL 基础语法 -- u…

基于Spring Boot+Vue的在线考试系统(有错题训练功能)

文章目录项目介绍主要功能截图&#xff1a;登录系统日志在线考试错题训练考试记录题库管理试题管理角色管理用户管理部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、…

解决:文档根元素 “configuration“ 必须匹配 DOCTYPE 根 “null“或者“mapper” 必须匹配 DOCTYPE 根 “null”

文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null 出现的原因是在配置mybatis-config.xml的时候没有把文件中的配置信息加进去导致的 解决的方式只需要在<configuration>标签前面加上如下内容: <?xml version"1.0" encoding"UT…

MySQL —— 库的操作

文章目录1. 创建数据库2. 字符集和校验规则3. 数据库的基本操作3.1 查看数据库3.2 显示创建数据库的语句3.3 修改数据库3.4 删除数据库3.5 备份&#xff0c;还原数据库4. 查看数据库的连接情况1. 创建数据库 基本语法&#xff1a; create database if not exists 数据库名 选项…

共享内存

简介&#xff1a; 共享内存两个或多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;&#xff0c;由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种IPC机制无需内核介入。需要做的就是让一个进程将数据复制到共享内存段中&#xff…

数据挖掘,计算机网络、操作系统刷题笔记51

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记51 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

剑指 Offer 32 - I. 从上到下打印二叉树

摘要 剑指 Offer 32 - I. 从上到下打印二叉树 剑指 Offer 32 - II. 从上到下打印二叉树 II 剑指 Offer 32 - III. 从上到下打印二叉树 III 一、二叉树的层序遍历 题目要求的二叉树的从上至下打印&#xff08;即按层打印&#xff09;&#xff0c;又称为二叉树的广度优先搜索…

解决问题:resource IDS cannot be used in a switch statement in Android library

# 发现问题在抽取lib的时候发现了这样一个问题&#xff0c;如图所示&#xff1a;1. 很正常的onClick事件的处理&#xff0c;使用的swtich语句&#xff0c;但是却报了resource IDS cannot be used in a switch statement in Android library这个问题&#xff0c;原因是...2. and…

kafka架构体系

Kafka简介 Kafka是一个由Scala和Java编写的企业级的消息发布和订阅系统&#xff0c;最早是由Linkedin公司开发&#xff0c;最终开源到Apache软件基金会的项目。Kafka是一个分布式的&#xff0c;支持分区的&#xff0c;多副本的和多订阅者的高吞吐量的消息系统&#xff0c;被广…