力扣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]
相关推荐
近津薪荼1 小时前
dfs专题9——找出所有子集的异或总和再求和
算法·深度优先
Tisfy1 小时前
LeetCode 761.特殊的二进制字符串:分治(左右括号对移动)
算法·leetcode·字符串·递归·分治
二十雨辰1 小时前
[python]-多任务
python
小O的算法实验室1 小时前
2025年AEI SCI1区TOP,面向城市区域监视的任务驱动多无人机路径规划三阶段优化策略,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
癫狂的兔子1 小时前
【Python】【机器学习】集成算法(随机森林、提升算法)
python·算法·机器学习
kong79069281 小时前
Python核心语法-Matplotlib简介
开发语言·python·matplotlib
马克Markorg2 小时前
基于LLM的大模型的RAG(检索增强生成)实现对比
python·大模型·agent·rag·企业级知识库的框架·rag 知识库
小龙报2 小时前
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列
c语言·开发语言·数据结构·c++·算法·贪心算法·动态规划
yy.y--2 小时前
Java线程实现浏览器实时时钟
java·linux·开发语言·前端·python