当前位置: 首页 > news >正文

LeetCode Hot100 刷题笔记(9)—— 二分查找、技巧

目录

前言

一、二分查找

1. 搜索插入位置

2. 搜索二维矩阵

3. 在排序数组中查找元素的第一个和最后一个位置

4. 搜索旋转排序数组

5. 寻找旋转排序数组中的最小值

6. 寻找两个正序数组的中位数

二、技巧

1. 只出现一次的数字

2. 多数元素

3. 颜色分类

4. 下一个排列

5. 寻找重复数


前言

一、二分查找:搜索插入位置,搜索二维矩阵,在排序数组中查找元素的第一个和最后一个位置,搜索旋转排序数组,寻找旋转排序数组中的最小值,寻找两个正序数组的中位数。

二、技巧:只出现一次的数字,多数元素,颜色分类,下一个排列,寻找重复数。


一、二分查找

1. 搜索插入位置

原题链接:35. 搜索插入位置 - 力扣(LeetCode)

# 解法(1)
class Solution(object):def searchInsert(self, nums, target):if target in nums:return nums.index(target)else:nums.insert(0, float('-inf'))nums.insert(len(nums), float('inf'))for i, n in enumerate(nums):if nums[i] < target and nums[i+1] > target:return i# 解法(2)
class Solution(object):def searchInsert(self, nums, target):for k,v in enumerate(nums):if target<=max(nums):if v<target:continuereturn kelse:return len(nums)

2. 搜索二维矩阵

原题链接:74. 搜索二维矩阵 - 力扣(LeetCode)

class Solution(object):def searchMatrix(self, matrix, target):matrix = sum(matrix, [])if target in matrix:return Truereturn False

3. 在排序数组中查找元素的第一个和最后一个位置

原题链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

# 解法(1)
class Solution(object):def searchRange(self, nums, target):if target not in nums:return [-1, -1]else:left = nums.index(target)nums.sort(reverse=True)right = len(nums)- nums.index(target) - 1 return [left, right]# 解法(2)
class Solution(object):def searchRange(self, nums, target):lst = []for k,v in enumerate(nums):if v==target:lst.append(k)if not lst:lst = [-1,-1]return [min(lst), max(lst)]

4. 搜索旋转排序数组

原题链接:33. 搜索旋转排序数组 - 力扣(LeetCode)

class Solution(object):def search(self, nums, target):if target in nums:return nums.index(target)else:return -1

5. 寻找旋转排序数组中的最小值

原题链接:153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

class Solution(object):def findMin(self, nums):return min(nums)

6. 寻找两个正序数组的中位数

原题链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

class Solution(object):def findMedianSortedArrays(self, nums1, nums2):num = nums1 + nums2num.sort()ln = len(num) if ln % 2 == 0:mid = (num[ln//2-1] + num[ln//2]) / 2.0else:mid = num[ln//2]return mid

二、技巧

1. 只出现一次的数字

原题链接:136. 只出现一次的数字 - 力扣(LeetCode)

# 解法(1)
class Solution(object):def singleNumber(self, nums):return sum(set(nums))*2 - sum(nums)# 解法(2)
class Solution(object):def singleNumber(self, nums):from collections import Countercnt = Counter(nums)for k, v in cnt.items():if v == 1:return k

2. 多数元素

原题链接:169. 多数元素 - 力扣(LeetCode)

# 解法(1)
class Solution(object):def majorityElement(self, nums):nums.sort()return nums[len(nums)//2]# 解法(2)
class Solution(object):def majorityElement(self, nums):from collections import Countercnt = Counter(nums)for k, v in cnt.most_common(1):return k

3. 颜色分类

原题链接:75. 颜色分类 - 力扣(LeetCode)

class Solution(object):def sortColors(self, nums):return nums.sort()   

4. 下一个排列

原题链接:31. 下一个排列 - 力扣(LeetCode)

class Solution(object):def nextPermutation(self, nums):# [4,5,2,6,7,3,1]   先找2,在找3i = len(nums) -1while i>0 and nums[i-1]>=nums[i]:i -= 1if i>0:j = len(nums) - 1while nums[j] <= nums[i-1]:j -= 1nums[i-1], nums[j] = nums[j], nums[i-1]nums[i:] = sorted(nums[i:])

5. 寻找重复数

原题链接:287. 寻找重复数 - 力扣(LeetCode)

# 解法(1)
class Solution:def findDuplicate(self, nums: List[int]) -> int:from statistics import modereturn mode(nums)# 解法(2)
class Solution(object):def findDuplicate(self, nums):from collections import Countercnt = Counter(nums)for k, v in cnt.most_common(1):return k

http://www.mrgr.cn/news/96907.html

相关文章:

  • 【1】搭建k8s集群系列(二进制部署)之系统初始化
  • Python设计模式:代理模式
  • 2024年信息素养大赛 C++小学组初赛 算法创意实践挑战赛 真题答案解析
  • 查询条件与查询数据的ajax拼装
  • whisper 语音识别的安装与使用
  • LeetCode 解题思路 30(Hot 100)
  • GitHub高级筛选小白使用手册
  • Spring AI MCP Server + Cline 快速搭建一个数据库 ChatBi 助手
  • React-01React创建第一个项目(npm install -g create-react-app)
  • 【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
  • Transformer
  • Flinksql--订单宽表
  • [高级数据结构]线段树SegmentTree
  • React PDF 预览终极优化:30 页大文件不卡,加载快如闪电!
  • python操作es
  • UniApp集成极光推送详细教程
  • Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气工具示例
  • Laravel 中使用 JWT 作用户登录,身份认证
  • 【硬件视界9】网络硬件入门:从网卡到路由器
  • IO 端口与 IO 内存