刷题记录-数组

124 阅读2分钟

刷题记录-数组

day1-二分查找

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums)-1
        while(left < right-1):
            middle = (left + right) // 2
            if nums[middle] == target:
                return middle
            elif nums[middle] < target:
                left = middle
            else:
                right = middle
        # 此时所有数组中的元素最多只有坐标left,right没有比较过,最后讨论他们的情况
        if nums[left] == target:
            return left
        elif nums[right] == target:
            return right
        else:
            return -1

相关题目

35. 搜索插入位置

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

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

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

相比于704,这次的分情况讨论要考虑3种情况

  • target比nums[right]大 返回值是right+1
  • target<=nums[left] 比如[1,3]1,或者[1,3],0 此时返回都是0,就是left
  • 其他的情况就是target在(left, right],此时就是返回right。比如[1,3],2或者[1,3],3
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums)-1
        while(left < right-1):
            middle = (left+right)//2
            if nums[middle] == target:
                return middle
            elif nums[middle] < target:
                left = middle
            else:
                right = middle
        
        if nums[right] < target:
            return right + 1
        elif nums[left] >= target:
            return left
        else:
            return right

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

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

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

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

来源:力扣(LeetCode) 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 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:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        result = [-1,-1]
        if len(nums) == 0:
            return result
        # 找左面的第一个
        left, right = 0, len(nums)-1
        while (left < right-1):
            middle = (right+ left)//2
            if nums[middle] >= target:
                right = middle  # 因为是找最左面的,所以在相等的时候右指针移动
            else:
                left = middle

        # 先用left比较
        if nums[left] == target:
            result[0] = left
        elif nums[right] == target:
            result[0] = right
        else:
            result[0] = -1

        # 找右面的第一个
        left, right = 0, len(nums)-1
        while (left < right-1):
            middle = (right+ left)//2
            if nums[middle] <= target:
                left = middle  # 因为是找最右面的,所以在相等的时候左指针移动
            else:
                right = middle
        
        # 先用right比较
        if nums[right] == target:
            result[1] = right
        elif nums[left] == target:
            result[1] = left
        else:
            result[1] = -1
        return result

69. x 的平方根

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

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

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

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

示例 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:
        if x == 1:
            return 1
        if x == 0:
            return 0
        left , right = 1, x//2
        while(left < right-1):
            middle = (left+ right)//2
            if middle ** 2 == x:
                return middle
            elif middle**2 < x:
                left = middle
            elif middle ** 2 > x:
                right = middle
        if right ** 2 <= x:
            return right
        return left