力扣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]
相关推荐
hhzz8 小时前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi8 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
QiLinkOS8 小时前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议
疯狂打码的少年8 小时前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
小O的算法实验室9 小时前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
weixin_408099679 小时前
OCR批量识别图片方案:从手动处理到自动化API系统(Python/Java/PHP实战)
图像处理·python·ocr·文字识别·api调用·批量识别·石榴智能
AI行业学习9 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
Coder_Shenshen9 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
大圣编程10 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
硕风和炜10 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集