【算法】二分查找-20231120

这里写目录标题

  • [一、75. 颜色分类](#一、75. 颜色分类)
  • [二、80. 删除有序数组中的重复项 II](#二、80. 删除有序数组中的重复项 II)
  • [三、125. 验证回文串](#三、125. 验证回文串)
  • [四、189. 轮转数组](#四、189. 轮转数组)

一、75. 颜色分类

提示

中等

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = 2,0,2,1,1,0

输出:0,0,1,1,2,2

示例 2:

输入:nums = 2,0,1

输出:0,1,2

思路:快速排序

python 复制代码
def fast_sort(nums):
    if len(nums) <= 1:
        return nums
    povit = nums[0]
    left = []
    right = []
    for i in range(1, len(nums)):
        if nums[i] < povit:
            left.append(nums[i])
        else:
            right.append(nums[i])
    return fast_sort(left) + [povit] + fast_sort(right)


nums = [2, 0, 2, 1, 1, 0]
print(fast_sort(nums))

二、80. 删除有序数组中的重复项 II

中等

932

相关企业

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = 1,1,1,2,2,3

输出:5, nums = 1,1,2,2,3

解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = 0,0,1,1,1,1,2,3,3

输出:7, nums = 0,0,1,1,2,3,3

解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

python 复制代码
def test(nums):
    slow=2
    fast=2
    while fast<len(nums):
        if nums[fast]!=nums[slow-2]:
            nums[slow]=nums[fast]
            fast+=1
            slow+=1
        else:
            fast+=1
    return slow

nums=[0,0,1,1,1,1,2,3,3]
print(test(nums))

三、125. 验证回文串

简单

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例 1:

输入: s = "A man, a plan, a canal: Panama"

输出:true

解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"

输出:false

解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "

输出:true

解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。

由于空字符串正着反着读都一样,所以是回文串。

python 复制代码
s = "A man, a plan, a canal: Panama"
res=s.replace(' ','').replace(',','').replace(':','').lower()
print(res)
def test2(s):
    left=0
    right=len(s)-1
    while left<=right:
        if s[left]==s[right]:
            left+=1
            right-=1
        else:
            return False
    return True
s="raceacar"
print(test2(s))

四、189. 轮转数组

提示

中等

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = 1,2,3,4,5,6,7, k = 3

输出: 5,6,7,1,2,3,4

解释:

向右轮转 1 步: 7,1,2,3,4,5,6

向右轮转 2 步: 6,7,1,2,3,4,5

向右轮转 3 步: 5,6,7,1,2,3,4

示例 2:

输入:nums = -1,-100,3,99, k = 2

输出:3,99,-1,-100

解释:

向右轮转 1 步: 99,-1,-100,3

向右轮转 2 步: 3,99,-1,-100

解题思路

三次翻转,先整体翻转,然后根据K的位置前后局部翻转。

python 复制代码
class Solution:
    def rotate(self,nums,k):
        k=k%len(nums)
        self.reverse(nums,0,len(nums)-1)
        self.reverse(nums,0,k-1)
        self.reverse(nums,k,len(nums)-1)

    def reverse(self,nums,start,end):
        while start<end:
            nums[start],nums[end]=nums[end],nums[start]
            start+=1
            end-=1

nums=[1,2,3,4,5,6,7]
k=3
S=Solution()
S.rotate(nums, k)
print(nums)
相关推荐
别动我齐刘海2 分钟前
实时控制学习2
linux·c++·人工智能·学习·算法
有Li11 分钟前
EEG脑电图数据处理基础
人工智能·算法·机器学习·语言模型·医学生
XMXFS22 分钟前
小红书推荐算法底层逻辑解析:用数据思维做内容优化
python·算法·新媒体运营·推荐算法
hans77488296824 分钟前
仅根据BMI反推身高和体重?还真能做到!只需要简单的数论知识~
python·数学
0+11129 分钟前
算法 --栈
算法·leetcode
鶴哥只手遮天32 分钟前
Gmsh 源码深度解析-第 2 章 几何内核
算法·开源
鶴哥只手遮天38 分钟前
Gmsh 源码深度解析-第 9 章 后处理与插件体系
算法·开源
圣保罗的大教堂39 分钟前
leetcode 3723. 数位平方和的最大值 中等
leetcode
鶴哥只手遮天40 分钟前
Gmsh 源码深度解析-第 7 章 网格质量、优化与高级技术
算法·开源
鶴哥只手遮天1 小时前
OpenFOAM 源码深度剖析 · 第二季-15 实战:手写一个求解器、库与边界条件
算法·开源