【算法】二分查找-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)
相关推荐
j7~20 小时前
【C++】模板初阶--函数模板,类模板详解
数据结构·c++·算法·函数模板·类模板·函数模板实例化
指尖在键盘上舞动20 小时前
RKNN 模型部署:onnx转rknn后精度下降 —— 精度调优与问题排查
python·ubuntu·rk3588·rknn·onnx·npu
IT策士20 小时前
Redis 从入门到精通:数据结构Hash 与 List
数据结构·redis·哈希算法
CodeSheep程序羊20 小时前
宇树科技,即将上市!
java·c语言·c++·人工智能·python·科技·硬件工程
AI玫瑰助手20 小时前
Python函数:内置函数(len/max/min/sorted等)详解
android·开发语言·python
ziyitty20 小时前
解决Windows下Bash调用Python输出中文乱码的问题
windows·python·bash
栈溢出了20 小时前
torch.gather 用法笔记
pytorch·python·深度学习
无限码力20 小时前
阿里算法岗 0530笔试真题 - 寻找满足条件的最优子序列
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试真题·阿里算法题
杨超越luckly20 小时前
Agent应用指南:利用GET请求获取赛力斯汽车门店位置信息
python·html·汽车·可视化·门店
@小阿宝20 小时前
机器人正向逆向运动学
算法·机器人