力扣131.分割回文串、35.搜索插入位置、74.搜索二维矩阵、34.在排序数组中查找...

131.分割回文串

思路:

分为两个函数,一个判断是否为回文串,一个进行回溯。回溯从左往右进行,已遍历的不再重复遍历,因而递归时下标要右移。

代码:

python 复制代码
class Solution:
    # 判断回文串
    def isPalindrome(self, ss):
        if ss[:] == ss[::-1]:
            return True
        else:
            return False

    # 回溯
    def backtracking(self, s, startIndex, path, result):
        if startIndex >= len(s):
            result.append(path[:])
            return

        for i in range(startIndex, len(s)):
            if self.isPalindrome(s[startIndex:i + 1]):
                path.append(s[startIndex:i + 1])
                self.backtracking(s, i + 1, path, result)  # 从下一个开始
                path.pop()

    def partition(self, s: str) -> List[List[str]]:
        result = []
        self.backtracking(s, 0, [], result)
        return result

35.搜索插入位置

思路:

若选取闭区间,则获得的左右端点都是可用值,且左右端点可以相等;由左右端点获得中间点用于判断,返回左端点。

代码:

python 复制代码
class Solution:
    def searchInsert(self, 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
            else:
                right = mid - 1

        # left 在循环结束时指向的是目标值应该插入的位置,使得插入后数组仍然有序; right 指向的是目标值应该插入位置的前一个位置
        return left

74.搜索二维矩阵

方法一:

思路:

借用的上一题的思路,已知一维矩阵如何进行二分查找,二维矩阵就可以用这个思路逐行进行查找。要注意的是,每一个循环都要重新设置left和right,所以定义在循环内

代码:

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        # 借用的上一题的思路,已知一维矩阵如何进行二分查找,二维矩阵就可以逐行进行查找
        for row in range(len(matrix)):
            left, right = 0, len(matrix[0]) - 1
            while left <= right:
                mid = (left + right) // 2
                if matrix[row][mid] < target:
                    left = mid + 1
                elif matrix[row][mid] > target:
                    right = mid - 1
                else:
                    return True
        
        return False

复杂度分析:

时间复杂度:O(mlogn)

空间复杂度:O(1)

方法二:

思路:

把二维矩阵拉成一个一维矩阵进行二分查找。

参考:

https://leetcode.cn/problems/search-a-2d-matrix/solutions/2783931/liang-chong-fang-fa-er-fen-cha-zhao-pai-39d74

代码:

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m, n = len(matrix), len(matrix[0])
        left, right = 0, m * n - 1
        while left <= right:
            mid = (left + right) // 2
            x = matrix[mid // n][mid % n]  # 巧妙!通过整除和取余来得到对应元素
            if x == target:
                return True
            if x < target:
                left = mid + 1
            else:
                right = mid - 1

        return False

复杂度分析:

时间复杂度:O(logmn)

空间复杂度:O(1)

34.在排序数组中查找...

思路:

二分查找 红蓝染色法【基础算法精讲 04】_哔哩哔哩_bilibili

代码:

python 复制代码
class Solution:
    def lower_bound(self, nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left

    def searchRange(self, nums: List[int], target: int) -> List[int]:
        start = self.lower_bound(nums, target)  # 本函数求取的是大于等于target,即下边界
        if start == len(nums) or nums[start] != target:
            return [-1, -1]
        # 上边界相当于是小于等于
        end = self.lower_bound(nums, target + 1) - 1
        return [start, end]
相关推荐
心中有国也有家11 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
前端若水11 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事11 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
碧海银沙音频科技研究院11 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
涛声依旧-底层原理研究所12 小时前
残差连接与层归一化通俗易懂的详解
人工智能·python·神经网络·transformer
csdn_aspnet12 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
fantasy_arch12 小时前
pytorch人脸匹配模型
人工智能·pytorch·python
熊猫_豆豆12 小时前
广义相对论水星近日点进动完整详细数学推导
python·天体·广义相对论
web3.088899913 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python