首页 > 其他分享 >力扣-34-在排序数组中查找元素的第一个和最后一个位置

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

时间:2023-11-14 15:12:41浏览次数:36  
标签:right target nums 34 力扣 middle 查找 left

一、题目

力扣地址:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/

二、解法思路:

也是二分查找相关题目,详细解法看注释

from typing import List


class Solution:
    """
    leetcode:34
    二分查找类题目,与传统二分查找的区别为,需要在一个不递减的数组中找到左右边界。
    较为简单的做法是采用两个二分查找,分别找到左边界和右边界。
        寻找左边界:当二分查找到第一个target时,不return,而是把此处暂时标记为左边界,并把该index左边的数组继续进行查找,
        若还能找到target,则更新左边界,如此反复。
        寻找右边界:同左边界一样,只不是找到一个target时,把index的右边继续进行查找
    """

    def searchInsert(self, nums: List[int], target: int) -> int:
        # 特殊处理边界,直接返回
        if not nums:
            return [-1, -1]
        if target > nums[len(nums) - 1] or target < nums[0]:
            return [-1, -1]
        left = 0
        right = len(nums) - 1
        target_left_idx = -1
        target_right_idx = -1
        while left <= right:
            middle = left + ((right - left) >> 1)
            if target == nums[middle]:
                target_left_idx = middle
                right = middle - 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                left = middle + 1
        # 初始化left和right
        left = 0
        right = len(nums) - 1
        while left <= right:
            middle = left + ((right - left) >> 1)
            if target == nums[middle]:
                target_right_idx = middle
                left = middle + 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                left = middle + 1

        return [target_left_idx, target_right_idx]


if __name__ == '__main__':
    s = Solution()
    print(s.searchInsert(nums=[], target=0))

三、其他解法与类似

...

标签:right,target,nums,34,力扣,middle,查找,left
From: https://www.cnblogs.com/chiyun/p/17831623.html

相关文章

  • 力扣-35-搜索插入位置
    一、题目力扣地址:https://leetcode.cn/problems/search-insert-position/二、解法思路与标准的二分查找一直,唯一的区别为,若所需target不在nums中,需要找到insert的索引fromtypingimportListclassSolution:"""leetcode:35在二分法的基础上延伸,若无法找到......
  • 力扣-704-二分查找
    一、题目力扣链接:https://leetcode.cn/problems/binary-search/description/二、解法思路标准的二分查找题目,常规上有左闭右闭和左闭右开的解法1、左闭右闭classSolution:"""leetcode:704采用左闭右闭的方式,[left,right]区间的定义这就决定了二分法的代......
  • 二叉搜索树的插入 查找 删除
    //1、定义二叉搜索树类,封装查找、插入、删除操作删除最为麻烦,其中对于parent的保存用循环来记录while的条件需多加考虑#include<queue>#include<iostream>usingnamespacestd;classBinaryTreeNode{  private:  intvalue;  BinaryTreeNode*leftChild;......
  • 根据行列标题名称,查找二维数据源的值区域内容!
    1职场实例小伙伴们大家好,随着冬至的到来,天气也是越发的寒冷起来,不少地方竟然飘起了今年第一场早雪,而我们今天要讲解重温一个Excel界热度很高的问题:如何根据行列标题名称,查找二维数据源的值区域内容?如下图所示:A1:D4单元格为数据源区域。数据源区域是一个明显的二维表格式的表格。A列......
  • 35-二分查找
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输......
  • 力扣 1460 脑筋急转弯
    1460.通过翻转子数组使两个数组相等对两个数组就行排序。依次对比,有不同则返回false。所有数字一样,那就一定可以翻转使得两个数组相等,翻转次数不同而已,总能达到。当有数字不一样,那一定不会相等。classSolution{public:boolcanBeEqual(vector<int>&target,vector<int>&a......
  • 代码随想训练营第三十四天(Python)| 1005.K次取反后最大化的数组和、134. 加油站、135.
    1005.K次取反后最大化的数组和classSolution:deflargestSumAfterKNegations(self,nums:List[int],k:int)->int:nums.sort(key=lambdax:abs(x),reverse=True)foriinrange(len(nums)):ifnums[i]<0andk>0:......
  • 文心一言 VS 讯飞星火 VS chatgpt (134)-- 算法导论11.2 6题
    六、用go语言,假设将n个关键字存储到一个大小为m且通过链接法解决冲突的散列表中,同时已知每条链的长度,包括其中最长链的长度L,请描述从散列表的所有关键字中均匀随机地选择某一元素并在O(L·(1+1/a))的期望时间内返回该关键字的过程。文心一言,代码不能运行:在这个问题中,我们需......
  • JavaSE day06【排序查找算法,Map集合,集合的嵌套,斗地主案例】测评题
    选择题题目1(多选):下列关于TreeSet集合排序的原理正确的是()选项:​ A.排序方法如果返回的是小于0,代表的是当前元素较小,需要存放在左边​ B.排序方法如果返回的是大于0,代表的是当前元素较大,需要存放在右边​ C.排序此方法如果返回的是0,代表的是当前元......
  • Excel word pdf查找
    importorg.apache.commons.lang.StringUtils;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.text.PDFTextStripper;importorg.apache.poi.ooxml.POIXMLDocument;importorg.apache.poi.openxml4j.opc.OPCPackage;importorg.apache.poi.xssf.......